【问题标题】:How many variables point to the object and which [.net]有多少变量指向对象以及哪个[.net]
【发布时间】:2011-04-23 09:52:58
【问题描述】:

我想创建自己的 xml-serializer 类,因为我需要 System.Xml.Serialization.XmlSerializer 之外的其他格式。我的想法是将原始类型(如 Integer、Double、String)的属性视为 XmlAttributes。

为了正确实现一个可用的 Xml-Serialization,我需要知道哪些变量指向同一个对象(二进制序列化以这种方式运行)。因为一个对象应该只被序列化一次,这样连接就不会丢失。 在 XmlSerialisation 方面,我有将类的路径作为特殊 XmlAttribute 插入的想法。

你有提示我如何处理这种情况吗?

### 编辑

感谢您的回答。
XmlAttributeAttribute 可能比编写我自己的 Serializer 需要更多的工作,因为只有原始类型的变量(并且有很多)应该被序列化为 XmlAttributes。在那里犯错更可怕。
到目前为止,我会使用一种哈希解决方案(当然)。但我的想法是减少这个散列解决方案的工作,如果我能确保对象只被引用一次。 您有此类问题的链接吗?

【问题讨论】:

    标签: c# .net vb.net serialization xml-serialization


    【解决方案1】:

    您可以在序列化程序中存储引用,作为序列化过程的一部分。当您遇到需要序列化的引用时,请查看您已经序列化的引用 - 如果找到它,输出适当的 ID(或其他),以便您可以在反序列化时适当地恢复引用。如果没有,请序列化对象并记住引用(和关联的 ID),以便在树的其他地方使用相同的引用时可以发现它。

    另一方面,我会努力使用内置的序列化程序,然后再提出自己的序列化程序。例如,要将值存储在属性中,您可以使用[XmlAttributeAttribute]

    【讨论】:

    • 对不起,我的误解。你的意思是......“可以”在“你自己的”序列化程序中存储引用......?还是您说的是 System.Xml.Serialization.XmlSerializer?
    • 无论如何感谢我所缺少的属性的提示/链接
    • @Oops:你只需要保留一个List<object>(或类似的东西)——这是假设你正在实现自己的序列化程序,希望你不需要这样做。
    【解决方案2】:

    您不需要计算指向每个对象的变量的数量,只需将每个对象序列化一次。

    相反,您可以保留一个已序列化对象的列表,并且对于每个新对象,您可以检查它是否已存在于该列表中。如何比较对象取决于您 - 例如,您可以使用 Equalscompare object references

    如果您决定使用Equals,那么您将能够获得更好的性能,因为您可以将对象存储在HashSet 中。

    【讨论】:

    • 感谢您的链接。由于复杂性原因,HashSet/HashTable/Dictionary 会比 List 更好。 (比较每个新旧)
    【解决方案3】:

    您可以使用Hashtable 对象并确保您的对象被序列化一次。您可以在值中保留对象的 XML 表示。然后你需要使用 XML 的 ref 来重新加载一次。

    一般object.ReferenceEquals(o1, o2)会告诉你对象是否相同。

    说实话,我不想站在你的立场上。工作量很大,我不确定创建一个从头开始的序列化器是否可行。

    【讨论】:

    • 谢谢。 “......穿上你的鞋子”是的,我也是;)。我很高兴它一定不是那么普遍,一个更特殊的解决方案就可以完成这项工作。我现在走了一半,整个反序列化器大约有 167 行
    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    相关资源
    最近更新 更多