序列化和反序列化

序列化与反序列化

序列化:把对象转换为字节数组。在java中通过ObjectOutputStream序列化。序列化后须接收序列化的结果。所以在ObjectOutputSteam构造方法需要要一个OutputStream或其子类输出流对象,这个对象就是负责接收序列化结果的。

反序列化:把字节数组转换为对象。在java中通过ObjectInputStream反序列化,反序列化的结果在内存,需要通过输入流对象接收反序列化结果。所以在ObjectInputStream构造方法参数必须要一个InputStream对象,这个对象就负责接收反序列化结果的。

为什么要序列化?

序列化后对象就是字节数组。变为字节数组后就可以把数组中内容输出到本地硬盘中,在网络通信中,数据传输时也需要将对象转换为字节。

如何序列化

让需要序列化的类实现Serializable接口,实现了这个接口代表这个类允许被序列化。

通过Java中ObjectOutputStream把对象进行序列化, ObjectInputStream把对象反序列化。

属性值不参与序列化

如果类中包含一些私密属性,例如: 密码等。可以通过transient关键字,禁止该属性值被序列化。

序列码

在实现了Serializable接口的类中。如果没有显示添加序列码会由JVM生成一个。

程序员也可以自己显示添加一个序列码,这个序列码和类中代码有关系,如果类中内容不变序列化和反序列化是没有影响的。

但是在企业级项目中,难免碰见需要修改类结构的情况。例如:添加一个新的属性。当我们修改了类结构后,类中自动生成的序列码就会改变。但是要求序列化和反序列化时序列码必须相同。而由于序列码的改变,所以在反序列化时会出错。为了防止这种问题,开发中只要实现了序列化都会添加序列码。

把序列化结果输出到文件中

public static void main(String[] args) throws IOException, ClassNotFoundException {
  Student zs = new Student("zs", 18);
  ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:/a.txt"));
  oos.writeObject(zs);
}

把文件中内容反序列化为对象

public static void main(String[] args) throws IOException, ClassNotFoundException {
  ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:/a.txt"));
  Student stu = (Student) ois.readObject();
  System.out.println(stu);
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值