浅谈java序列化

1、概念:

  序列化:把对象转换为字节序列的过程

  反序列化:把字节序列转化为对象的过程

 

2、代码:

public class Person implements Serializable{
  // 指定序列化版本号
public static final long serialVersionUID = 112233445566778899L;
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 class SerializeTest { public static void main(String[] args) {
        serializeObj();
deserializeObj();
}
/**
* 序列化
*/
public static void serializeObj() {
Person person = new Person();
person.setName("李白");
person.setAge(10);
try {
       // 把对象序列化后的字节存放到指定的文件里 
File file = new File("E:/person.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(person);
System.out.println("序列化完成");
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 反序列化
*/
public static void deserializeObj() {
try {
File file = new File("E:/person.txt");
FileInputStream fileInputStream = new FileInputStream(file);
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
Person person = (Person) objectInputStream.readObject();
System.out.println("反序列化完成");
System.out.println(person);
objectInputStream.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}


3、用处 

  服务器端session的存储、通信时传输的数据等。
  服务器把session序列化后存到硬盘,以便节省内存,用到的时候在进行反序列化成Session对象。
  通信时数据传输的是序列化的字节,接收参数时会进行反序列化成特定对象。

4、serialVersionUID
  该字段是序​列​化​的​版​本​号​,实现了Serializable接口的类都有这个变量。
  该字段可显示指定,也可不指定。当不指定时,编译器会自动给这个class生成一个默认的版本号。
  
serialVersionUID 是序列化和反序列化之间的接头暗号,只有这个暗号对得上反序列化才能成功!

  如果实现
Serializable 接口的时候没有指定 serialVersionUID 也是没什么问题的,但会存在一种隐患:序列化后,将Person类进行了修改,哪怕是加个空格,反序列化也会失败!
  因为编译器认为你的Person类结构变了,会重新生成一个serialVersionUID,反序列化的时候暗号对不上,无法反序列化。
  所以,建议实现Serializable接口的时候指定serialVersionUID,避免反序列化时的兼容性冲突。

 

















posted @ 2021-09-13 16:40  one剑飘红  阅读(64)  评论(0编辑  收藏  举报