反序列化后,对象引用似乎不同

时间:2013-04-09 22:28:24

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

通过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中的对象不会更改。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

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

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

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