java - 序列化和反序列化 transient 对象的棘手情况

标签 java serialization transient

这是我的代码:

class Collar {
  int size;
}

class Dog implements Serializable {
  int weight;
  transient Collar c;

  public Dog(int weight, int size) {
    this.weight = weight;
    c = new Collar();
    c.size = size;
  }

  public void writeObject(ObjectOutputStream os) throws Exception {
    os.defaultWriteObject();
    os.writeInt(c.size);
  }

  public void readObject(ObjectInputStream is) throws Exception {
    is.defaultReadObject();
    c = new Collar();
    c.size = is.readInt();
  }
}

public class test {
  public static final String FILE_REVISION = "$Revision$";

  public static void main(String ar[]) throws Exception {
    Dog dOut = new Dog(20, 2);

    System.out.println("DOut Weight: " + dOut.weight + " Size: " + dOut.c.size);

    FileOutputStream fo = new FileOutputStream("Dog.ser");
    ObjectOutputStream os = new ObjectOutputStream(fo);
    os.writeObject(dOut);

    FileInputStream fi = new FileInputStream("Dog.ser");
    ObjectInputStream is = new ObjectInputStream(fi);
    Dog dIn = (Dog) is.readObject();

    System.out.println("DIn Weight: " + dIn.weight + " Size: " + dIn.c.size);
  }
}

这是输出:

DOut Weight: 20 Size: 2
Exception in thread "main" java.lang.NullPointerException
    at test.main(test.java:55)

第 55 行是包含 System.out.println() 的最后一行代码

程序能够取回可序列化的对象,这里就是 Dog。但是,当我使用自定义 readObject 方法回读时,它无法创建新的“遏制”对象 Collar。我哪里出错了?

如您所见,“dIn.c.size”语句中的输出为 NullPointerException。尽管我在自定义 readObject 方法中将 c 设置为新对象,但它并没有真正工作。

最佳答案

因为 Collar creadObject 内是 transient ,因此您需要首先初始化 c

c.size = is.readInt();<-- NullPointerException Here

这里需要先初始化C

c = new Collar();
c.size = is.readInt();

两个方法签名都是错误的,它们应该如下所示:

 private void writeObject(ObjectOutputStream stream) throws IOException {
    stream.defaultWriteObject();
    stream.writeInt(c.size);
}

private void readObject(ObjectInputStream stream) throws IOException,
        ClassNotFoundException {
    stream.defaultReadObject();
    c = new Collar();
    c.size = stream.readInt();
}

您可以阅读有关序列化的更多详细信息 here

关于java - 序列化和反序列化 transient 对象的棘手情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12882044/

相关文章:

java - 使用 Spring JPA 和 Hibernate 更新数据库分区上的记录时出错

java - hibernate 异常 Null 值被分配给原始类型 setter 的属性

c# - 反序列化多维 JSON 字符串

java - 即使使用 transient 也不会出现 NotSerializedException

java - 可序列化类中的不可序列化字段(transient 关键字)

java - 反序列化后 transient 字段变为空?

java - 如何将音频流式传输到 OpenAL Sources?

java - Truecaller android sdk 错误代码 3

c# - ArgumentException 标识符 ' ' 不符合 CLS。关于连载

java - kryo的核心技术是什么?