3

假设我们有 3 个类:

class foo { // not a singleton
    String s;
}
class bar {
    foo f;
    int i;
}
class baz {
    foo sameF;
}

现在我们创建实例

foo onlyFoo = new foo("the only one");
bar theBar = new bar(onlyFoo, 123);
baz theBaz = new baz(onlyFoo);

之后,我们希望将它们序列化存储在一个文件中。如果我们反序列化 theBaz,修改 onlyFoo 并再次反序列化 theBaz 到文件,theBar 仍然包含原来的 onlyFoo,所以 onlyFoo 有两个不同的版本。

相反,我想要的是我存储 theBaz 和 theBar而没有onlyFoo,分别存储三个对象,一旦有人反序列化 theBaz,我也想给他 onlyFoo。如果他再次反序列化更改后的 onlyFoo,theBaztheBar 将具有相同的修改后的 onlyFoo,因此如果有人请求一个对象(例如 theBar),他将获得具有所有引用对象(onlyFoo)的完整序列化对象,就像正常的序列化过程将返回.

我知道我必须手动单独存储对象并保留引用,因为默认序列化无法处理此问题。我不知道如何部分序列化/反序列化 Java 对象?我需要将原语及其包装器与“更高”对象分开并单独存储这些对象。

更新

  1. 我无法修改课程。
  2. 我不知道所有的课程。它应该适用于我可能从未听说过的所有可序列化对象(它们可能是也可能不是最终的
4

3 回答 3

2

如果你想要更多的控制,你可以覆盖 writeObject() 和 readObject() 并自己序列化。

class bar {
    ...

    private void writeObject(ObjectOutputStream stream) throws IOException {
      // let version 1, later when you need to have versioning. 
      stream.writeInt(version);
      stream.writeInt(i);
      // leave out 
      // stream.writeObject(foo);

    }
}
// read object the analog, see 

http://docs.oracle.com/javase/6/docs/platform/serialization/spec/output.html#861

于 2012-11-30T18:15:01.170 回答
1

标记您不想用瞬态关键字序列化的引用。

于 2012-11-30T17:52:34.920 回答
0

你可以做foo transient如下。

class bar {
    transient foo f;
    int i;
}
于 2012-11-30T18:07:44.380 回答