Java部分(de)对象序列化
假设我们有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 而不仅仅是Foo,分别存储三个对象,一旦有人反序列化了Baz我也想给他只有.Foo。 如果他再次对已更改的onlyFoo进行反序列化,则theBaz 和 theBar将具有相同的仅修改过的对象,因此如果有人请求对象(例如theBar),则会获得包含所有引用对象(onlyFoo)的完整序列化对象,就像正常的序列化过程将返回。
我知道我必须存储对象并手动和单独保存引用,因为默认序列化无法处理此问题。 我不知道的是如何部分序列化/反序列化Java对象? 我需要将原语及其包装器与“更高”的对象分开,并分别存储这些对象。
更新
- 我不能修改类。
- 我不知道所有课程。 它应该适用于我可能从未听说过的所有可序列化对象( 它们可能是也可能不是最终的 )
如果你想要更多的控件,你可以覆盖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
标记您不希望使用transient关键字序列化的引用。
你可以使foo
transient
如下。
class bar { transient foo f; int i; }