java序列化的一些知识点

来源:互联网 发布:淘宝客营销计划条件 编辑:程序博客网 时间:2024/05/17 09:46

1.序列化只会序列化非transit的实例变量,不会序列化静态变量,因为他是属于类的

2.通过readObject,writeObject定义自己的序列化方式,比如一个链表类,和需要
加密特殊处理的字段

3列化ID的问题:
标示了版本号,版本号一致才能反序列化成功。修改代码同时要跟新版本号,以确保另一端
能够识别错误的版本,然后进行修成

public class Test implements Serializable {

private static final long serialVersionUID = 1L;

。。。。。。。。。。。。。。。。。。。

}

4.除了对象之外,Java中的基本类型和数组也是可以通过ObjectOutputStreamObjectInputStream来序列化的

5.如果你先序列化对象A后序列化B,那么在反序列化的时候一定记着JAVA规定先读到的对象是先被序列化的对象,不要先接收对象B,那样会报错

代码分析:

实例1:

ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("result.obj"));

Test test = new Test();

//试图将对象两次写入文件

out.writeObject(test);

out.flush();

System.out.println(new File("result.obj").length());

out.writeObject(test);

out.close();

System.out.println(new File("result.obj").length());

ObjectInputStream oin = new ObjectInputStream(new FileInputStream( "result.obj"));

//从文件依次读出两个文件

Test t1 = (Test) oin.readObject();

Test t2 = (Test) oin.readObject();

oin.close();

//判断两个引用是否指向同一个对象

System.out.println(t1 == t2);

结果为:

34

38

true

Java 序列化机制为了节省磁盘空间,具有特定的存储规则,当写入文件的为同一对象时,并不会再将对象的内容进行存储,而只是再次存储一份引用,上面增加的 54字节的存储空间就是新增引用和一些控制信息的空间。反序列化时,恢复引用关系,使得清单 3 中的 t1 和 t2 指向唯一的对象,二者相等,输出 true。该存储规则极大的节省了存储空间。

实例2:

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("result.obj"));

Test test = new Test();

test.i = 1;out.writeObject(test);

out.flush();

test.i = 2;out.writeObject(test);

out.close();

ObjectInputStream oin = new ObjectInputStream(new FileInputStream( "result.obj"));

Test t1 = (Test) oin.readObject();

Test t2 = (Test) oin.readObject();

System.out.println(t1.i);

System.out.println(t2.i);


 

 实例2  的目的是希望将 test 对象两次保存到 result.obj 文件中,写入一次以后修改对象属性值再次保存第二次,然后从 result.obj 中再依次读出两个对象,输出这两个对象的 i 属性值。案例代码的目的原本是希望一次性传输对象修改前后的状态。

结果两个输出的都是 1, 原因就是第一次写入对象以后,第二次再试图写的时候,虚拟机根据引用关系知道已经有一个相同对象已经写入文件,因此只保存第二次写的引用,所以读取时,都是第一次保存的对象。读者在使用一个文件多次 writeObject 需要特别注意这个问题。

 

 

原创粉丝点击