Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何序列化从ReadOnlyCollection派生的类_C#_.net 4.0_Datacontractserializer_Readonly Collection - Fatal编程技术网

C# 如何序列化从ReadOnlyCollection派生的类

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>

当我尝试序列化从ReadOnlyCollection派生的我自己的类时,我得到错误:

带有CollectionDataContractAttribute属性的类型“MyReadOnlyCollection`1[[System.String,mscorlib,Version=4.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]是无效的集合类型,因为它没有默认构造函数

// 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列表):基本(列表)
{
}
}
两个问题:

  • 为什么我可以序列化ReadOnlyCollection而不能序列化派生类
  • 如何正确序列化派生类
  • 更新: 我已经在上面添加了派生类

    如何正确序列化派生类?
    要正确序列化派生类,应该执行以下操作

    [DataContract]
    public class MyReadOnlyCollection<T>:ReadOnlyCollection<T>
    {
    
        public MyReadOnlyCollection(IList<T> list) : base(list)
        {
        }
    }
    
    [DataContract]
    公共类MyReadOnlyCollection:ReadOnlyCollection
    {
    公共MyReadOnlyCollection(IList列表):基本(列表)
    {
    }
    }
    
    编辑

    您不能使用
    [CollectionDataContract]
    ,因为它不完全满足收集类型要求,因为缺少Add方法,因此该类型不被视为收集类型


    有关更多信息

    是的,我已经用我的班级更新了我的原始帖子。然而,我使用的是[CollectionDataContract],这是否正确?