Java部分(de)对象序列化

时间:2012-11-30 17:49:56

标签: java serialization deserialization binary-serialization

假设我们有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我也想给他只有.Foo。如果他再次对已更改的onlyFoo进行反序列化,则theBaz theBar将具有相同的仅修改的onlyFoo,因此如果有人请求对象(例如theBar),则会获得包含所有引用对象的完整序列化对象(onlyFoo)就像正常的序列化过程会返回一样。

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

更新

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

标记您不希望使用transient关键字序列化的引用。

答案 2 :(得分:0)

您可以点击foo transient

class bar {
    transient foo f;
    int i;
}