📅  最后修改于: 2023-12-03 15:16:32.668000             🧑  作者: Mango
Java中的序列化和反序列化是处理对象持久化和通信的两个重要概念。
Java中的序列化指将一个对象转换成字节流,以便在网络上传输或者保存到本地磁盘中。序列化可以用于实现数据的持久化,使得对象可以长久的存储在本地的磁盘上,等需要时再将其反序列化出来使用。
Java中的序列化是通过实现Serializable接口来实现的。示例代码如下:
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
// getter 和 setter 方法省略
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
代码中我们自定义了一个人物类Person,实现了Serializable接口。这样,Person类就可以被序列化和反序列化了。
对于一个序列化对象,可以使用ObjectOutputStream来将其写入到输出流中,示例代码如下:
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class SerializeDemo {
public static void main(String[] args) {
Person person = new Person();
person.setName("Tom");
person.setAge(18);
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"))) {
oos.writeObject(person);
oos.flush();
} catch(Exception e) {
e.printStackTrace();
}
}
}
代码中我们将一个Person对象写入到本地的person.dat文件中。注意,写入到输出流中的对象必须是实现了Serializable接口的类。
Java中的反序列化指将一个字节流转换成对象,以便在程序中使用。反序列化可以用于网络通信或者本地文件读取,可以将一个已经序列化的对象重新还原成原来的状态。
对于一个序列化的对象,可以使用ObjectInputStream来将其读取出来,示例代码如下:
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class DeserializeDemo {
public static void main(String[] args) {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"))) {
Person person = (Person) ois.readObject();
System.out.println(person.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
代码中我们从本地的person.dat文件中读取一个Person对象,并将其转换成实例。注意,读取到的对象必须进行类型转换。
序列化ID是一个很重要的概念,它用于版本控制,可以保证在不同的版本中反序列化仍然能够正确无误。
Java会根据类的各种特征信息如属性、方法、父类等来生成一个唯一的序列化ID,当类发生改变时,序列化ID也会相应发生改变。为了保证版本兼容,可以自定义序列化ID。
示例代码如下:
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = 2L; // 自定义序列化ID
private String name;
private int age;
// getter 和 setter 方法省略
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
代码中我们自定义了一个序列化ID为2,这样即使Person类的属性发生改变,我们还是可以反序列化成功。
Java中的序列化和反序列化是处理对象持久化和通信的两个重要概念。序列化可以将一个对象转换成字节流,以便在网络上传输或者保存到本地磁盘中;反序列化可以将一个字节流转换成对象,以便在程序中使用。在序列化过程中,需要注意自定义序列化ID,以保证版本兼容。