C# 如何序列化从ReadOnlyCollection派生的类
当我尝试序列化从ReadOnlyCollection派生的我自己的类时,我得到错误: 带有CollectionDataContractAttribute属性的类型“MyReadOnlyCollection`1[[System.String,mscorlib,Version=4.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]是无效的集合类型,因为它没有默认构造函数C# 如何序列化从ReadOnlyCollection派生的类,c#,.net-4.0,datacontractserializer,readonly-collection,C#,.net 4.0,Datacontractserializer,Readonly Collection,当我尝试序列化从ReadOnlyCollection派生的我自己的类时,我得到错误: 带有CollectionDataContractAttribute属性的类型“MyReadOnlyCollection`1[[System.String,mscorlib,Version=4.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]是无效的集合类型,因为它没有默认构造函数 // OK ReadOnlyCollection<string>
// 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)
{
}
}
现在这个错误有意义了,我确实没有默认的构造函数。但是,我能够使用DataContractSerializer序列化ReadOnlyCollection,即使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)
{
}
}
//好的
ReadOnlyCollection ReadOnlyCollection=新的ReadOnlyCollection(新列表{“a”、“b”、“c”});
字符串result1=序列化(readOnlyCollection);
//引发InvalidDataContractException
MyReadOnlyCollection MyReadOnlyCollection=新的MyReadOnlyCollection(新列表{“a”、“b”、“c”});
字符串result2=序列化(myReadOnlyCollection);
公共静态字符串序列化(对象o)
{
var serializer=新的DataContractSerializer(o.GetType());
var stringBuilder=新的stringBuilder();
使用(XmlWriter=XmlWriter.Create(stringBuilder))
{
serializer.WriteObject(xmlWriter,o);
}
返回stringBuilder.ToString();
}
[收集数据合同]
公共类MyReadOnlyCollection:ReadOnlyCollection
{
公共MyReadOnlyCollection(IList列表):基本(列表)
{
}
}
两个问题:
如何正确序列化派生类?
要正确序列化派生类,应该执行以下操作
[DataContract]
public class MyReadOnlyCollection<T>:ReadOnlyCollection<T>
{
public MyReadOnlyCollection(IList<T> list) : base(list)
{
}
}
[DataContract]
公共类MyReadOnlyCollection:ReadOnlyCollection
{
公共MyReadOnlyCollection(IList列表):基本(列表)
{
}
}
编辑
您不能使用[CollectionDataContract]
,因为它不完全满足收集类型要求,因为缺少Add方法,因此该类型不被视为收集类型
有关更多信息是的,我已经用我的班级更新了我的原始帖子。然而,我使用的是[CollectionDataContract],这是否正确?