java序列化与反序列化也是IO中比较重要的一部分,序列化是指将java对象转化成二进制形式输出,反序列化顾名思义就是将二进制流再转为对象的过程。
在java中使用java对象流来进行对象的序列化和反序列化;
ObjectOutputStream:通过 writeObject()方法做序列化操作
ObjectInputStream:通过 readObject() 方法做反序列化操作
![](https://i-blog.csdnimg.cn/blog_migrate/49e09a714c256662c871fd10ff2c9887.png)
第一步:创建一个javaBean对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class Person implements Serializable{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this .name = name; } public int getAge() { return age; } public void setAge( int age) { this .age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]" ; } public Person(String name, int age) { super (); this .name = name; this .age = age; } } |
第二步:使用ObjectOutPutStream对象实现序列化
1 2 3 4 5 6 | //在根目录下新建一个 io 的文件夹 OutputStream op = new FileOutputStream( "io" +File.separator+ "a.txt" ); ObjectOutputStream ops = new ObjectOutputStream(op); ops.writeObject( new Person( "vae" , 1 )); ops.close(); |
运行代码后,打开a.txt文档会发现文档里边的内容是乱码的,并不是说程序出错了,而是因为这是二进制文件。
第三步:使用ObjectInputStream 对象实现反序列化
反序列化的对象必须要提供该对象的字节码文件.class
1 2 3 4 5 6 7 | InputStream in = new FileInputStream( "io" +File.separator+ "a.txt" ); ObjectInputStream os = new ObjectInputStream(in); byte [] buffer = new byte [ 10 ]; int len = - 1 ; Person p = (Person) os.readObject(); System.out.println(p); //Person [name=vae, age=1] os.close(); |
问题1:如果某些数据不需要做序列化,比如密码,比如上面的年龄?
解决办法:在字段面前加上 transient,那么我们在反序列化的时候,打印出来的就是Person [name=vae, age=0],整型数据默认值为 0
1 2 | private String name; //需要序列化 transient private int age; //不需要序列 |
问题2:序列化版本问题,在完成序列化操作后,由于项目的升级或修改,可能我们会对序列化对象进行修改,比如增加某个字段,那么我们在进行反序列化就会报错,这时只需要在对象类里边加上一个系列化版本号字段即可;
解决办法:在 JavaBean 对象中增加一个 serialVersionUID 字段,用来固定这个版本,无论我们怎么修改,版本都是一致的,就能进行反序列化了