【问题标题】:How to solve dependency when deserializing object graph反序列化对象图时如何解决依赖关系
【发布时间】:2012-07-26 05:29:33
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: serialization graph deserialization


    【解决方案1】:

    供以后参考...

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2012-01-31
      • 2023-03-11
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多