1

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

例如,如果一个对象A引用自己A,(自循环引用)这意味着,它希望自己A在恢复时处于完整的原始状态。因为它在被序列化的时候就是那个状态。

对于自引用的情况,它可以被检测到,因为它知道自己正在被恢复。但是如果A需要另一个对象B,它也应该期望另一个对象B处于完整的原始状态。如果对象B还引用了A,那么现在又出现了循环引用 ,并且在不知道现在正在恢复A的情况下,它变成了同样的问题。如果想使用while反序列化的一些属性,不保证存在。ABA

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

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

PS。我开始编写代码来替代 Cocoa 的NSKeyedArchiver. 所以我假设对象的编码是由对象本身完成的。(对于它的内部状态)所以它可能与一般图形问题不同。但我不能排除对象本身可以获得的隐藏状态......

4

1 回答 1

1

供以后参考...

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

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

所以我决定把我所有的数据结构都转换成树形结构。这对结构造成了很大的限制。因为它没有循环依赖,所以所有节点都可以用完全恢复的子节点信息来恢复。

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

DAG 有很大的局限性。引用不能是循环的。我考虑过弱引用的概念,但它在反序列化时需要完整的原始状态是相同的。这是一个巨大的限制,但我决定用强大的反序列化算法来权衡这一点。我认为共享儿童参考对我来说就足够了。实际上,失去健壮性对我来说是不可接受的,所以我决定走这条路。

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

于 2012-07-26T11:05:28.247 回答