【问题标题】:After deserialisation object references seem to be different反序列化后对象引用似乎不同
【发布时间】:2013-04-09 22:28:23
【问题描述】:

在通过 DataContracts 序列化自定义数据对象并恢复它们时,我遇到了一个奇怪的问题。我有以下出现问题的类:

[DataContract]
public class ProjectManager
{
    // list of projects
    [DataMember]
    public List<Project> ProjectList { get; set; }

    // active project
    [DataMember]
    public Project ActiveProject { get; set; }

    // instance variable
    [DataMember]
    private static ProjectManager instance = null;

ActiveProject 保存对 ProjectList 中一个对象的引用。问题是,在一种情况下,ActiveProject 中保存的引用似乎不等于 ProjectList 中的引用,尽管列表中只有一个。如果我更改我的 ActiveProject,我在 ProjectList 中的对象不会更改。

仅在反序列化数据后才会出现此问题,我不知道如何防止此错误发生。这种行为是否可能,或者我的代码中是否必须存在我尚未找到的交叉引用?

【问题讨论】:

  • 你能在Project上覆盖Equals吗?
  • Is this behaviour possible 是的,当你反序列化一个对象时,你有一个不同的实例。
  • 在反序列化之后,我对ActiveProject 的列表进行了 foreach 检查。它返回一个“真”,所以错误必须在我的代码中的其他任何地方。该死的墓碑...谢谢提示!

标签: c# windows-phone-7 datacontractserializer pass-by-reference


【解决方案1】:

通常反序列化不会处理引用相同对象的 2 个对象。相反,它可能会在每个引用位置创建一个新对象。

尝试二进制序列化/反序列化。

如果仍然失败,您可以创建自己的序列化,并创建一个对象引用列表。一旦你用一个引用序列化一个对象,你之前已经存储了(之前序列化),那么你可以添加一个特殊的标签,这样你就可以在反序列化过程中重建对同一对象的引用。

但这是我计划添加到我的序列化的下一件事,所以.. 自定义序列化的时间可能太长了。希望二进制序列化就足够了

另一种解决方法是使用列表并使用整数(引用正确的索引号)而不是第二个引用。或者构建任何其他变量来帮助您重建双重引用

【讨论】:

  • 反序列化意味着从流中读取一些字节并创建一个对象。 reference 永远不会相同,即使所有属性/字段都相同。 (即使是二进制序列化)
  • @I4V 在将原始对象与反序列化的序列化相同对象进行比较时,您是对的,但我认为这里的问题是序列化类包含对同一对象的多个引用,并且反序列化了多个每个引用都指向单个对象。 (因此序列化类的变量之间的对象引用确实发生了变化) C.A->D C.B->D ..deserialize(serialize(C)).. C.A->D C.B->D'
  • 我做了一些测试:我反序列化了数据并比较了它们。创建的对象似乎是相等的。所以我改变了一个对象并再次比较。现在对象不相等。反序列化后存在两个唯一的单独对象。
  • 我终于通过使用整数作为对列表中正确对象的索引引用解决了这个问题。反序列化后,我将对象分配给 ActiveProject。有效!
【解决方案2】:

DataContractSerializer 支持保留对象引用;请参阅preserveObjectReferences 构造函数参数in this overload。您可能需要更改创建序列化程序的方式以支持这一点。

【讨论】:

  • 看起来很像我正在寻找的东西,但对于初学者来说有点难以实施。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多