一、什么是Java序列号
Java 序列号是将一个对象转换成字节序列的过程,以便进行持久化,网络传输或者程序间的数据交换。
对 Java 对象进行序列化的代码通常使用 java.io 库中的 ObjectOutputStream 类。
二、如何对Java对象进行序列化
1、实现 java.io.Serializable 接口。该接口为空接口,它的目的是表明类的对象可以被序列化。如果不实现 Serializable 接口,将在运行时抛出 NotSerializableException。
public class Student implements java.io.Serializable { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } }
2、使用 ObjectOutputStream 对象的 writeObject 方法。以下是将 Student 对象写入文件的示例:
try { FileOutputStream fos = new FileOutputStream("student.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); Student student = new Student("Tom", 18); oos.writeObject(student); oos.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); }
三、如何反序列化对象
1、使用 ObjectInputStream 对象的 readObject 方法。以下是从文件中读取 Student 对象的示例:
try { FileInputStream fis = new FileInputStream("student.ser"); ObjectInputStream ois = new ObjectInputStream(fis); Student student = (Student) ois.readObject(); System.out.println(student.getName() + ", " + student.getAge()); ois.close(); fis.close(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); }
四、注意事项
1、序列化过程中,所有字段都被序列化,包括私有字段和 final 字段。
2、如果一个类的某个字段不想被序列化,可以使用 transient 修饰该字段。
3、序列化的类和反序列化的类必须是同一个类。如果两者不匹配,会抛出 InvalidClassException。
4、Java默认的序列化机制不够灵活,如果需要更灵活的序列化方式,可以考虑使用第三方开源库,如 Google 的 ProtoBuf。
五、总结
Java 序列化是一种将对象转换成字节流的过程。通过实现 Serializable 接口,使用 ObjectOutputStream 和 ObjectInputStream 可以实现对象的序列化和反序列化。
需要注意的是,序列化的类和反序列化的类必须是同一个类,并且默认的序列化机制存在一些局限性,适用场景较为受限。