使用 DataContract Serializer 反序列化后,集合变为只读

本文关键字:集合 只读 DataContract Serializer 反序列化 使用 | 更新日期: 2023-09-27 18:35:03

应该非常简单,但是在使用DataContractSerializer反序列化我的业务对象后,其中的所有自定义集合都变成了只读。

确切地说,我试图通过交换集合中的项目在反序列化后操纵集合,但这是抛出异常,说集合是只读的。但是,在序列化之前,一切都很好。

发生类型为"系统.不支持的异常"的未处理异常 在 mscorlib 中.dll 其他信息:集合是只读的。

这就是我装饰自定义集合类的方式。

[Serializable]
[DataContract]
[KnownType(typeof(RuleBase))]
[KnownType(typeof(RuleSet))]
public class GenericRuleCollection : ObservableCollection<IRule>
{
    //...
}

这就是我装饰业务对象类的方式。

[Serializable]
[DataContract]
public class RuleSet : GenericRuleContainer
{
    //...
}
[Serializable]
[DataContract(IsReference = true)]
public abstract class GenericRuleContainer : GenericRule, IRuleContainer
{        
    private GenericRuleCollection _children;     
    [DataMember]
    public GenericRuleCollection Children
    {
        get { return _children; }
        set { SetProperty(ref _children, value); }
    }
    //...
}
序列化

和反序列化代码段:

public class DataContractSerializer<T>
{
    public void SerializeToFile(string fileName, T obj)
    {
        var serializer = new DataContractSerializer(typeof(T));
        using (FileStream fs = File.Open(fileName, FileMode.Create))
        {                
            serializer.WriteObject(fs, obj);
        }
    }
    public T DeserializeFromFile(string fileName)
    {
        var serializer = new DataContractSerializer(typeof(T));
        using (FileStream fs = File.Open(fileName, FileMode.Open))
        {
            object s2 = serializer.ReadObject(fs);
            return (T)s2;
        }
    }
}

使用 DataContract Serializer 反序列化后,集合变为只读

在对谷歌进行一些随机研究之后,我可以通过在我的自定义集合类上将属性修饰从 [DataContract] 更改为 [CollectionDataContract] 来解决此问题。

[Serializable]
[CollectionDataContract]
[KnownType(typeof(RuleBase))]
[KnownType(typeof(RuleSet))]
public class GenericRuleCollection : ObservableCollection<IRule>
{
    //...
}