0

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)
    {
    }
}

2 つの質問:

  1. ReadOnlyCollection をシリアル化できるのに、派生クラスをシリアル化できないのはなぜですか?
  2. 派生クラスを正しくシリアル化するにはどうすればよいですか?

更新: 上記の派生クラスを追加しました

4

1 に答える 1

1

How should I serialize my derived class correctly? 派生クラスを正しくシリアル化するには、次のようにする必要があります

[DataContract]
public class MyReadOnlyCollection<T>:ReadOnlyCollection<T>
{

    public MyReadOnlyCollection(IList<T> list) : base(list)
    {
    }
}

編集

Add[CollectionDataContract]メソッドがないため、コレクション型の要件を完全に満たしていないため、使用できません。そのため、型はコレクション型と見なされません。

詳細については Collection Types in Data Contracts

于 2014-04-08T15:34:41.787 に答える