📜  什么是 java 中的序列化和反序列化 (1)

📅  最后修改于: 2023-12-03 15:21:46.328000             🧑  作者: Mango

什么是 Java 中的序列化和反序列化

在Java中,序列化是指将对象转换为字节序列,以便可以将其存储在文件中、在网络上传输或者在内存中传递。而反序列化则是将字节序列重新转换为对象,这样就可以重构原始的对象。

为什么需要序列化和反序列化

在分布式的应用环境中,对象需要在不同的进程中传输。而在不同的进程之间,对象的传输是通过网络进行的。网络传输的数据只能是字节序列,因此需要借助序列化和反序列化这两个机制来完成对象的传输。

此外,在Java中,对象中包含的数据和方法是保存在堆内存中的。当Java应用程序停止执行时,对象就会被销毁。为了将对象的状态永久地保存下来,需要将对象序列化到文件中或者数据库中。在下一次应用程序启动时,可以从文件或者数据库中读取对象的状态,然后将其反序列化到内存中。

Java中的序列化和反序列化

在Java中,序列化和反序列化是通过ObjectOutputStream和ObjectInputStream类完成的。这两个类分别从OutputStream和InputStream中派生而来。

序列化

要将对象序列化到字节序列中,需要创建一个ObjectOutputStream对象,然后调用它的writeObject()方法,将对象写入到输出流中。例如,下面的代码将一个Person对象序列化到文件中。

try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
    out.writeObject(new Person("Tom", 18));
} catch (IOException e) {
    e.printStackTrace();
}
反序列化

要将字节序列反序列化到对象中,需要创建一个ObjectInputStream对象,然后调用它的readObject()方法,从输入流中读取对象。例如,下面的代码将一个Person对象从文件中反序列化到内存中。

try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.ser"))) {
    Person person = (Person) in.readObject();
} catch (IOException | ClassNotFoundException e) {
    e.printStackTrace();
}
序列化和反序列化的限制

在Java中,不是所有的对象都能进行序列化和反序列化,对于那些不能序列化的对象,需要将其标记为transient或者实现Externalizable接口。

此外,在序列化和反序列化时,需要注意版本的兼容性。如果对象的类发生了变化,例如增加了一个字段,那么反序列化会出现ClassCastException异常。为了避免这个问题,可以使用serialVersionUID来指定版本号,这样即使类发生了变化,也可以保证反序列化能够正常进行。需要注意的是,serialVersionUID的值在类的变化后不能改变。

总结

Java中的序列化和反序列化是一种将对象转换为字节序列的机制,可以将对象在不同的进程之间传输或者将其保存到文件或者数据库中,从而实现对象的永久保存。在序列化和反序列化时,需要注意对象的兼容性和版本号的问题。