序列化(Serialization)和反序列化(Deserialization)是 Java 中用于在对象和字节之间进行转换的过程。
序列化:
序列化是将对象的状态转换为字节流的过程。在序列化过程中,对象的属性和数据被转换成字节的形式,以便存储在文件中、在网络上传输或在内存中进行持久化。Java 提供了 java.io.Serializable
接口,通过实现这个接口,一个类可以表明它是可序列化的。序列化可以使用 ObjectOutputStream
类来实现。
importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.ObjectOutputStream; importjava.io.Serializable; classPersonimplementsSerializable { privateStringname; privateintage; publicPerson(Stringname, intage) { this.name=name; this.age=age; } // Getters and setters} publicclassSerializationExample { publicstaticvoidmain(String[] args) { Personperson=newPerson("John", 25); try (ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream("person.ser"))) { oos.writeObject(person); System.out.println("Object serialized successfully."); } catch (IOExceptione) { e.printStackTrace(); } } }
反序列化:
反序列化是将字节流转换为对象的过程。在反序列化过程中,字节流中的数据被重新转换为对象的状态。Java 提供了 ObjectInputStream
类,用于实现反序列化。同样,被反序列化的类需要实现 java.io.Serializable
接口。
importjava.io.FileInputStream; importjava.io.IOException; importjava.io.ObjectInputStream; publicclassDeserializationExample { publicstaticvoidmain(String[] args) { try (ObjectInputStreamois=newObjectInputStream(newFileInputStream("person.ser"))) { Personperson= (Person) ois.readObject(); System.out.println("Object deserialized successfully."); System.out.println("Name: "+person.getName() +", Age: "+person.getAge()); } catch (IOException|ClassNotFoundExceptione) { e.printStackTrace(); } } }
在上述例子中,Person
类实现了 Serializable
接口,使得该类的对象可以被序列化和反序列化。在序列化过程中,对象被写入到文件中(person.ser
),而在反序列化过程中,从文件中读取字节流并转换成对象。
注意:序列化和反序列化并不仅仅限于文件操作,还可以在网络通信中用于对象的传输,或者在分布式系统中用于对象的存储和恢复。