Skip to content

序列化

java自带

序列化示例

java
User user = new User();
user.setName("Java");
user.setAge(25);

try (FileOutputStream fileOut = new FileOutputStream("/tmp/user.ser");
     ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
    out.writeObject(user);
} catch (IOException i) {
    i.printStackTrace();
}

反序列化示例

java
User user = null;
try (FileInputStream fileIn = new FileInputStream("/tmp/user.ser");
     ObjectInputStream in = new ObjectInputStream(fileIn)) {
    user = (User) in.readObject();
} catch (IOException i) {
    i.printStackTrace();
    return;
} catch (ClassNotFoundException c) {
    System.out.println("User class not found");
    c.printStackTrace();
    return;
}

System.out.println("Name: " + user.getName());
System.out.println("Age: " + user.getAge());

注意事项

  1. serialVersionUID:每个可序列化的类都建议显式声明serialVersionUID字段。这个字段用于验证序列化对象的发送方和接收方是否加载了与序列化兼容的类。
  2. transient关键字:如果不希望某个字段被序列化,可以使用transient关键字标记这个字段。被transient修饰的字段在序列化过程中会被忽略。
  3. 安全性:序列化也引入了潜在的安全问题,因为攻击者可能通过篡改序列化的数据来攻击系统。因此,需要谨慎处理反序列化操作,尤其是处理来自不受信任源的数据。

protostuffkyro