序列化
1、用处:当对象数据需要存储
2、序列化以及反序列化样例:
注意点:定义一个User类继承Serializable,其中serialVersionUID若不手动定义,系统将会默认根据类的属性哈希值计算出一个serialVersionUID值,所以这里有一个坑的地方是,当你后面再给类新加属性时,反序列化之前的数据,系统就会报错报两个serialVersionUID不一致问题(不兼容)。所以,对类进行序列化要随手定义初始化serialVersionUID。
public class User implements Serializable{
private static final long serialVersionUID = 6138451404259248696L;
private String name;
private String sex;
private int age;
private Part part;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", part=" + part +
'}';
}
}
注意点:若Part无需序列化,也就是不实现Serializable接口,在User类中定义Part时,可以加上transient修饰符表明这个属性无需序列化,否则系统会报无法序列化异常
public class Part implements Serializable {
private String name;
private String sex;
}
注意点:序列化以及反序列化实例,将user对象保存到txt文件内,再通过反序列化进行解析到对象。
//序列化
public class Test {
public static void main(String[] args){
OutputStream out = null;
ObjectOutputStream outputStream = null;
try{
out = new FileOutputStream("text.txt");
outputStream = new ObjectOutputStream(out);
User user = new User();
user.setName("小红");
user.setAge(14);
user.setSex("女");
Part part = new Part();
part.setName("miao");
part.setSex("女");
user.setPart(part);
outputStream.writeObject(user);
}catch (Exception e){
e.printStackTrace();
}finally {
try{
if (out != null){
out.close();
}
if(outputStream != null){
outputStream.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
//反序列化
@org.junit.Test
public void Test(){
InputStream input = null;
try {
input = new FileInputStream("text.txt");
ObjectInputStream out = new ObjectInputStream(input);
Object o= out.readObject();
System.out.println(o);
}catch (Exception e){
e.printStackTrace();
}finally {
try{
if(input != null){
input.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
注意点:自己可以代码复制下来,测试序列化test,再去掉自定义serialVersionUID,测试反序列化test