2012-07-26 62 views
1

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

例如,如果一个对象引用A本身A,(自我循环引用)这意味着,它希望本身A完整原始状态同时它恢复。因为它在序列化时处于该状态。

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

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

能给我一些建议或很好地解决这个问题?

PS。 我开始编码这个做一些替代Cocoa的NSKeyedArchiver。所以我认为对象的编码是由对象本身完成的。 (对于它的内部状态)所以它可能会与一般的图形问题不同。但我不能排除隐藏状态,可以是由对象本身得到...

回答

1

对于日后参考...

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

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

所以我决定把我所有的数据结构切换到树形结构。这给结构造成很大的限制。由于它没有循环依赖性,因此所有节点都可以使用完全恢复的子节点信息进行恢复。

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

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

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