对象序列化和反向序列化
对象序列化和反向序列化
在Java中,对象序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。序列化的对象可以被写入到文件、数据库或通过网络传输。反向序列化,也称为反序列化,是序列化过程的逆过程,即将序列化后的数据恢复为Java对象。
要使Java对象能够被序列化,对象的类需要实现 java.io.Serializable
接口。这个接口是一个标记接口,不包含任何方法,但它会指示Java虚拟机这个类的对象是可序列化的。
对象序列化:
-
实现
Serializable
接口:
类通过实现Serializable
接口来声明它可以被序列化。 -
使用
ObjectOutputStream
进行序列化:
创建ObjectOutputStream
的实例,并将需要序列化的对象写入流中。 -
示例代码:
import java.io.FileOutputStream; import java.io.ObjectOutputStream; public class SerializationExample { public static void main(String[] args) { MyObject obj = new MyObject("Kimi", 123); try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("myobject.dat"))) { oos.writeObject(obj); } catch (Exception e) { e.printStackTrace(); } } }
对象反向序列化:
-
使用
ObjectInputStream
进行反向序列化:
创建ObjectInputStream
的实例,从存储介质中读取数据,并将其转换回Java对象。 -
处理
ClassNotFoundException
:
如果序列化的对象中包含了其他对象的引用,反序列化时需要确保这些类在运行时环境中可用,否则会抛出ClassNotFoundException
。 -
示例代码:
import java.io.FileInputStream; import java.io.ObjectInputStream; public class DeserializationExample { public static void main(String[] args) { try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("myobject.dat"))) { MyObject obj = (MyObject) ois.readObject(); System.out.println("Object deserialized: " + obj); } catch (Exception e) { e.printStackTrace(); } } }
注意事项:
- 只有实现了
Serializable
接口的类的对象才能被序列化。 - 静态字段不会被序列化,因为它们不属于对象的状态。
- 序列化过程中,如果对象中包含对其他对象的引用,这些对象也必须是可序列化的,否则会导致
NotSerializableException
。 - 反序列化创建的对象与原始对象不是同一个实例,它们是两个不同的对象,即使它们的字段值相同。
- 序列化和反序列化过程中可能会抛出
IOException
和ClassNotFoundException
,需要妥善处理这些异常。
序列化和反序列化是Java中处理对象持久性和网络传输的重要机制。通过这种方式,对象的状态可以在不同的运行时环境中保存和恢复。