序列化的必要条件
JAVA中的对象如果需要序列化,需要实现Serializable接口
其中有个最佳实践是要生成一个serialVersionUID。
关于serialVersionUID
为什么要手动生成一个serialVersionUID?
当反序列化时会去验证序列化文件中的serialVersionUID是否与当前类的serialVersionUID一致,如果一致才会反序列化成功,否则会失败。如果不主动声明的话,JAVA虚拟机会自动生成一个,当我们对类进行了一些变更,比如增加了一个属性,这个serialVersionUID就会有变化,反序列化时就会有问题,所以手动添加这个属性是明智之举。
关于transient
如果属性声明时有transient,该属性将不参与序列化。
示例代码
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SerializableTest {
@Test
void testSerializable() throws IOException, ClassNotFoundException {
DataVo dataVo = new DataVo();
File file = new File("D:\\temp\\test-serialize");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(dataVo);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
dataVo = (DataVo) ois.readObject();
System.out.println("value:"+dataVo.getValue());
}
public static class DataVo implements Serializable {
private static final long serialVersionUID = -5694210138567365397L;
private transient String value="hello world";
private String name;
public String getValue() {
return value;
}
}
}