java序列化的一些知识点

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 需要特别注意这个问题。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haorantiangang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值