C# 反序列化之后,对象引用似乎有所不同

C# 反序列化之后,对象引用似乎有所不同,c#,windows-phone-7,datacontractserializer,pass-by-reference,C#,Windows Phone 7,Datacontractserializer,Pass By Reference,当通过DataContract序列化自定义数据对象并恢复它们时,我遇到了一个奇怪的问题。我在以下课程中遇到了问题: [DataContract] public class ProjectManager { // list of projects [DataMember] public List<Project> ProjectList { get; set; } // active project [DataMember] publi

当通过DataContract序列化自定义数据对象并恢复它们时,我遇到了一个奇怪的问题。我在以下课程中遇到了问题:

[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;
[DataContract]
公共类项目经理
{
//项目清单
[数据成员]
公共列表项目列表{get;set;}
//活动项目
[数据成员]
公共项目ActiveProject{get;set;}
//实例变量
[数据成员]
私有静态ProjectManager实例=null;
ActiveProject保存对ProjectList中一个对象的引用。问题是,在一种情况下,虽然列表中只有一个引用,但ActiveProject中保存的引用似乎不等于ProjectList中的引用。如果我更改了我的ActiveProject,则ProjectList中的对象不会更改


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

通常反序列化不会处理引用相同对象的两个对象。相反,它可能会在t每个参考位置

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

如果仍然失败,您可以创建自己的序列化,并创建对象引用列表。只要使用之前已存储(之前已序列化)的引用序列化对象,就可以添加特殊标记,这样您就可以在反序列化期间重新生成对同一对象的引用

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


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

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

是否可以覆盖
Equals
关于
Project
这种行为是否可能
是当您反序列化一个对象时,您有一个不同的对象实例。在反序列化之后,我做了,并针对
ActiveProject
对列表进行了检查。它返回了一个“true”,因此错误必须在我代码中的任何其他地方。该死的逻辑删除…提示!反序列化意味着从流中读取一些字节并创建一个对象。即使所有属性/字段都相同,引用也永远不会相同。(即使使用二进制序列化)@I4V将原始对象与反序列化的同一对象进行比较时,您是对的,但我认为这里的问题是,序列化类包含对同一对象的多个引用,并且反序列化后,多个引用都指向单个对象。(因此序列化类的变量之间的对象引用会发生变化)C.A->D C.B->D..反序列化(serialize(C))…C.A->D C.B->D'I做了一些测试:我反序列化了数据并比较了它们。创建的对象似乎相等。因此我更改了一个对象并再次比较。现在对象不相等。反序列化后存在两个唯一的单独对象。我最终解决了问题,使用一个整数作为正确对象的索引引用列表中的对象。反序列化后,我将该对象分配给ActiveProject。Works!看起来很像我正在寻找的,但对于初学者来说有点难以实现。