使用 DataContractSerializer 反序列化后,Collection 得到 read-only
After Deserialization using DataContractSerializer, Collection gets read-only
这应该是非常简单的,但是在使用 DataContractSerializer
反序列化我的业务 objects 之后,它们中的所有自定义 collections 都变成了 read-only.
确切地说,我试图在反序列化后通过交换 collection 中的项目来操纵 collection,但这会抛出异常,说明 Collection 是 read-only。不过在连载前,一切正常
An unhandled exception of type 'System.NotSupportedException' occurred
in mscorlib.dll Additional information: Collection is read-only.
这就是我装饰我的习惯的方式 collection class。
[Serializable]
[DataContract]
[KnownType(typeof(RuleBase))]
[KnownType(typeof(RuleSet))]
public class GenericRuleCollection : ObservableCollection<IRule>
{
//...
}
这就是我装饰公司的方式object class。
[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;
}
}
}
在对 google 进行一些随机研究后,我可以通过将我的自定义集合 class 上的属性装饰从 [DataContract]
更改为 [CollectionDataContract]
来解决这个问题。
[Serializable]
[CollectionDataContract]
[KnownType(typeof(RuleBase))]
[KnownType(typeof(RuleSet))]
public class GenericRuleCollection : ObservableCollection<IRule>
{
//...
}
这应该是非常简单的,但是在使用 DataContractSerializer
反序列化我的业务 objects 之后,它们中的所有自定义 collections 都变成了 read-only.
确切地说,我试图在反序列化后通过交换 collection 中的项目来操纵 collection,但这会抛出异常,说明 Collection 是 read-only。不过在连载前,一切正常
An unhandled exception of type 'System.NotSupportedException' occurred in mscorlib.dll Additional information: Collection is read-only.
这就是我装饰我的习惯的方式 collection class。
[Serializable]
[DataContract]
[KnownType(typeof(RuleBase))]
[KnownType(typeof(RuleSet))]
public class GenericRuleCollection : ObservableCollection<IRule>
{
//...
}
这就是我装饰公司的方式object class。
[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;
}
}
}
在对 google 进行一些随机研究后,我可以通过将我的自定义集合 class 上的属性装饰从 [DataContract]
更改为 [CollectionDataContract]
来解决这个问题。
[Serializable]
[CollectionDataContract]
[KnownType(typeof(RuleBase))]
[KnownType(typeof(RuleSet))]
public class GenericRuleCollection : ObservableCollection<IRule>
{
//...
}