这应该非常简单,但在使用DataContractSerializer
反序列化我的业务对象后,其中的所有自定义集合都变为只读。
确切地说,我试图通过交换集合中的项目来反序列化之后操作集合,但这是抛出异常,说集合是只读的。但是,在序列化之前,一切都很好。
未处理的类型' System.NotSupportedException'发生了 in 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;
}
}
}
答案 0 :(得分:1)
经过对谷歌的一些随机研究后,我可以通过在我的自定义集合类中将属性修饰从[DataContract]
更改为[CollectionDataContract]
来解决此问题。
[Serializable]
[CollectionDataContract]
[KnownType(typeof(RuleBase))]
[KnownType(typeof(RuleSet))]
public class GenericRuleCollection : ObservableCollection<IRule>
{
//...
}