[英]How to Serialize class derived from ReadOnlyCollection
当我尝试序列化自己从ReadOnlyCollection派生的类时,出现错误:
类型为'MyReadOnlyCollection`1 [[System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]'的CollectionDataContractAttribute属性为无效集合类型,因为它没有默认构造函数。
现在该错误已成为现实,这是真的,我没有默认的构造函数。 但是,即使ReadOnlyCollection没有无参数的默认构造函数,我也可以使用DataContractSerializer序列化ReadOnlyCollection。
// OK
ReadOnlyCollection<string> readOnlyCollection = new ReadOnlyCollection<string>(new List<string> { "a", "b", "c" });
string result1 = Serialize(readOnlyCollection);
// Throws InvalidDataContractException
MyReadOnlyCollection<string> myReadOnlyCollection = new MyReadOnlyCollection<string>(new List<string> { "a", "b", "c" });
string result2 = Serialize(myReadOnlyCollection);
public static string Serialize(object o)
{
var serializer = new DataContractSerializer(o.GetType());
var stringBuilder = new StringBuilder();
using (XmlWriter xmlWriter = XmlWriter.Create(stringBuilder))
{
serializer.WriteObject(xmlWriter, o);
}
return stringBuilder.ToString();
}
[CollectionDataContract]
public class MyReadOnlyCollection<T> : ReadOnlyCollection<T>
{
public MyReadOnlyCollection(IList<T> list) : base(list)
{
}
}
两个问题:
更新:我在上面添加了我的派生类
How should I serialize my derived class correctly?
为了正确地序列化您的派生类,您应该执行以下操作
[DataContract]
public class MyReadOnlyCollection<T>:ReadOnlyCollection<T>
{
public MyReadOnlyCollection(IList<T> list) : base(list)
{
}
}
编辑
您无法使用[CollectionDataContract]
因为它没有完全满足集合类型的要求,因为缺少Add方法,因此该类型不被视为集合类型
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.