一、Java序列化的基本原理
Java对象序列化是将对象转换为字节序列的过程,反序列化是将字节序列转换为对象的过程。
Java序列化机制是基于IO流实现的,通过将对象输出为字节流,可以将数据储存到磁盘上或通过网络传递到其他计算机上。
Java序列化主要涉及以下三个类:
//java.io.Serializable接口是用来标记需要被序列化的类的接口 public interface Serializable{ } //java.io.ObjectOutputStream类负责将对象序列化为字节流 public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants{ //将Object对象序列化为字节流并输出到OutputStream中 public final void writeObject(Object obj) throws IOException; } //java.io.ObjectInputStream类负责将字节流反序列化为对象 public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants { //从InputStream中读取字节流并反序列化为一个Object对象 public final Object readObject() throws IOException, ClassNotFoundException; }
二、Java序列化的使用场景
Java序列化主要用于将Java对象永久保存到磁盘中或通过网络将Java对象传输到其他计算机上。
Java序列化的一个主要用途是实现对象的深拷贝,即通过序列化和反序列化将一个对象的所有状态信息复制给另一个对象。
Java序列化还可以用于分布式计算,当一个Java对象需要在不同的计算机之间传输时,可以先将对象序列化为字节流,然后通过网络传输到目标计算机,最后在目标计算机上反序列化为Java对象。
三、Java序列化的注意事项
Java序列化必须实现java.io.Serializable接口,否则会抛出java.io.NotSerializableException异常。
Java序列化对对象的某些属性可能会存在安全性问题,在某些情况下可能需要手动进行属性的清空或加密处理才能进行序列化。
Java序列化可能会影响性能,特别是在网络传输大量Java对象时,要注意序列化和反序列化所需要的时间和资源开销。
四、Java序列化的示例代码
以下代码展示了如何使用Java序列化将一个Java对象保存到磁盘中:
import java.io.*; public class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = 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; } public static void main(String[] args) throws IOException, ClassNotFoundException { //将Person对象序列化为字节流并写入文件 FileOutputStream fos = new FileOutputStream("person.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); Person person = new Person("张三", 20); oos.writeObject(person); oos.close(); //从文件中读取字节流并反序列化为Person对象 FileInputStream fis = new FileInputStream("person.ser"); ObjectInputStream ois = new ObjectInputStream(fis); Person p = (Person) ois.readObject(); System.out.println(p.getName() + ":" + p.getAge()); ois.close(); } }