首先对象需要实现可序列化接口Serializable
Serializable是个空接口,它就是个标识
对象的序列化就是把对象信息转成字节,这样就可以通过传输到网络上、磁盘中
对字节进行反序列化,就能把字节数据恢复成原来的对象
对象序列化流
ObjectOutputStream/ObjectInputStream
这两个流也是装饰设计模式
//只有实现了Serializable接口的类对象才能序列化
class Student implements Serializable{}
//构造需要传入一个OutputStream对象
ObjectOutputStream objOS = new ObjectOutputStream(new FileOutputStream("./obj.txt"));
Student xiaoming = new Student();
objOS.writeObject(xiaoming);
objOS.close();
//构造需要传入一个InputStream对象
ObjectInputStream objIS = new ObjectInputStream(new FileInputStream("./obj.txt"));
Student xiaoming_back = (Student)objIS.readObject();
objIS.close();
三个问题
1、序列化一个对象后,更改了其类文件,读数据会出现问题吗?有问题怎么解决?
- 类的串行版本与从流中读取的类描述符类型不匹配(serialVersionUID)
- 该类包含未知数据类型
- 该类无可用无参构造
以上三种情况会抛出InvalidClassException。
序列化的时候会给一个serialVersionUID来确保发送者和接受者有相同或兼容序列化数据的类,如果接受者的serialVersionUID不同,则抛出异常。
不过可以给实现了Serializable接口的类显式声明serialVersionUID成员变量(必须static final long),Java建议自己写serialVersionUID,让程序员控制兼容。serialVersionUID的默认值对成员变化太敏感了
2、如何不让某成员被序列化?
用transient修饰就可以让其不参与序列化
transient int property;