概述
序列化与反序列化
序列化:把对象转换为字节数组。在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);
}
最后
以上就是难过小兔子为你收集整理的序列化和反序列化的全部内容,希望文章能够帮你解决序列化和反序列化所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复