java序列化实现Serializable接口

java 序列化

java 序列化为什么要实现Serializable接口

什么是java序列化

java序列化是将对象写入字节流,将对象换成字节的表现形式

java实现序列化的意义

序列化之后的java对象,可以以字节流形式用于数据持久化操作,以及网络传输。
并且基于jvm平台的存在,序列化之后的字节流可以移植,独立存在运行。

java Serializable接口

java源码中,该接口就是一个空的,实现这个接口就是类添加标识,jvm实现序列化。

1.标识类对象为Serializabel之后,利用ObjectOutputStream输出流

2.创建输出流对象 Oos,利用writeObject()函数输出序列化结果

3.对于输出序列化结果,可以利用输入流ObjectOutputStream实现
  readObject()进行反序列化操作,获取对象

java demo实例

 //首先是序列化过程
 private static void testSerialize(File file) {
    // get A new Person as:
    Person newPerson = new Person(24,"Renln",75);
    /*
        -serialize  --- Persistent operation
        -Get an object (ObjectOutputStream)
     */
    try {
        ObjectOutputStream OosObject = new ObjectOutputStream(new FileOutputStream(file));
        OosObject.writeObject(newPerson);
        OosObject.close();
    }catch (IOException e){
        e.printStackTrace();
    }
}
```
Person对象序列化之后---
 sr javaSerializaiton.Person78芋_ I ageI weightL namet Ljava/lang/String;xp      Kt Renln
```
//这是反序列化过程
private static Person testDeserialize(File file ) {
    //get ByteStream from file ,then Desrialize by ObjectInputStream
    Person dnewPerson = new Person();
     try{
        ObjectInputStream OisObject =  new ObjectInputStream(new FileInputStream(file));
        dnewPerson = (Person)OisObject.readObject();
        OisObject.close();
    }catch (ClassNotFoundException e) {
         e.printStackTrace();
     }catch (IOException e) {
         e.printStackTrace();
     }
     return dnewPerson;
}
反序列化结果: desrialize:[Person(age=24, name=Renln, weight=75)]

java序列化为什么要实现Serializable接口

Serializable只是标识类对象为Serializable,真正工作的是ObjectO/FileInputStream中的WriteObject()与readObject()函数

其中函数源代码要求:

    // remaining cases
       if (obj instanceof String) {
           writeString((String) obj, unshared);
       } else if (cl.isArray()) {
           writeArray(obj, desc, unshared);
       } else if (obj instanceof Enum) {
           writeEnum((Enum<?>) obj, desc, unshared);
       } else if (obj instanceof Serializable) {
           writeOrdinaryObject(obj, desc, unshared);
       } else {
           if (extendedDebugInfo) {
               throw new NotSerializableException(
                   cl.getName() + "\n" + debugInfoStack.toString());
           } else {
               throw new NotSerializableException(cl.getName());
           }
       }

从上述代码可知,如果被写对象的类型是String,或数组,或Enum,或Serializable,那么就可以对该对象进行序列化,否则将抛出NotSerializableException。

那么如何保证类属性不被序列化呢?

  1. 函数提供关键字transient
  2. Static常量也不被序列化

java序列化实现Serializable接口_第1张图片

创建新的对象: Person newPerson = new Person(24,“Renln”,75,“秘密不可说”);
序列化结果:  sr javaSerializaiton.Person敡覞輤鋖 I ageI weightL namet Ljava/lang/String;xp  Kt Renln
反序列结果为: desrialize:[Person(age=24, name=Renln, weight=75, screet=null)]
设置screet字段为 transient之后,对比可发现其属性为:null

待解决:

1.查看序列化结果,可以发现String类型数据可以直接被读取,传输过程中是否出现遗失??窃取??
2.利用Externalizable实现序列化(Serializable子类)

你可能感兴趣的:(java学习,java)