如何在反序列化对象图时解决依赖问题

时间:2012-07-26 05:29:34

标签: serialization graph deserialization

当我通过按对象本身恢复所有每个节点和边缘来反序列化对象图时(对于面向对象的方式),我发现存在严重的依赖性问题。

例如,如果一个对象A引用自己A,(自循环引用)就意味着,它希望自己在中完成原始状态A 正在恢复。因为当它被序列化时处于该状态。

对于自引用的情况,可以检测它,因为它知道自己正在恢复。但是如果A需要另一个对象B,那么它应该期望另一个对象B处于完全原始状态。如果对象B也引用了A,那么现在再次对A进行循环引用,并且在不知道现在正在恢复A的情况下它会成为同等问题。 如果B想要在反序列化时使用A的某些属性,则无法保证其存在。

基本上,发生此问题是因为对象需要其他对象的完整状态,尽管其本身处于不完整状态。这没有意义。我已经考虑过将恢复过程划分为多个阶段,但它并没有产生任何真正的区别,因为实际上对象将保持不完整状态,直到所有阶段完成。

我可以为这个问题提供一些建议或解决方案吗?

PS。 我开始对此进行编码以替换Cocoa的NSKeyedArchiver。所以我假设对象的编码是由对象本身完成的。 (因为它的内部状态)所以它可能与一般的图形问题不同。但是我不能排除可以通过对象本身获取的隐藏状态......

1 个答案:

答案 0 :(得分:1)

供以后参考......

在我发布这个问题后,我研究了很多这个问题。我意识到这个问题根本无法解决。 (这个问题与一般图形不同,因为在我的情况下,每个节点都可以隐藏边缘,并且每个节点在恢复时都必须从自身解决边缘信息。)

核心问题是依赖性。所有每个节点都取决于其原始状态,在反序列化时无法访问。但如果它不依赖于不存在的状态,它可以完全序列化。而保证这一点的唯一方法就是放弃一般的图形结构。

所以我决定将所有数据结构切换为树形结构。这给结构带来了很大的限制。因为它没有循环依赖性,所以可以使用完全恢复的子节点信息恢复所有节点。

我找到了这个。 DAG。 http://en.wikipedia.org/wiki/Directed_acyclic_graph 它只是一个有共享孩子的有向树。我认为DAG结构也很好。因为依赖关系也可以完全解决。

DAG有很大的局限性。引用不能是循环的。我已经考虑过弱参考概念,但它反序列化时需要完整的原始状态。 这是一个巨大的限制,但我决定使用强大的反序列化算法进行交易。我认为共享的孩子参考对我来说已经足够了。实际上,失去稳健性对我来说是不可接受的,所以我决定这样做。

有了这些东西,我想我可以完全序列化/反序列化我的数据结构。 感谢互联网和维基百科。