【问题标题】:How to Serialize class derived from ReadOnlyCollection如何序列化从 ReadOnlyCollection 派生的类
【发布时间】:2014-04-08 15:32:03
【问题描述】:

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

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

现在错误是有道理的,确实我没有默认构造函数。但是,即使 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)
    {
    }
}

两个问题:

  1. 为什么我可以序列化 ReadOnlyCollection 而不是我的派生类?
  2. 我应该如何正确序列化我的派生类?

更新: 我在上面添加了我的派生类

【问题讨论】:

    标签: c# .net-4.0 datacontractserializer readonly-collection


    【解决方案1】:

    How should I serialize my derived class correctly? 要正确序列化你的派生类,你应该做这样的事情

    [DataContract]
    public class MyReadOnlyCollection<T>:ReadOnlyCollection<T>
    {
    
        public MyReadOnlyCollection(IList<T> list) : base(list)
        {
        }
    }
    

    编辑

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

    欲了解更多信息Collection Types in Data Contracts

    【讨论】:

    • 是的,我已经用我的班级更新了我的原始帖子。但是我正在使用 [CollectionDataContract],这是否正确?
    猜你喜欢
    • 2015-12-27
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多