14

重複の可能性:
IList<T> をシリアル化する方法は?

私が定義した別のクラスであるタイプSのプロパティを含むクラス(それを と呼びましょう)をシリアライズしたいと思います。クラスのインスタンスを XMLにシリアル化しようとすると、例外が発生します。はどの具象クラスを使用するかわからないため、これは理解できます。できれば属性を使用して、インスタンスをシリアル化/逆シリアル化するときにインスタンス化する具象クラスを指定する方法はありますか。私のクラスの実装は、クラスのインスタンスを作成します。私の例を説明するためのコードを次に示します。IList<T>TSXmlSerializerSList<T>

using System;
using System.Xml.Serialization;
using System.IO;

[Serializable]
public class T { }

[Serializable]
public class S
{
    public IList<T> ListOfTs { get; set; }

    public S()
    {
        ListOfTs = new List<T>();
    }
}

public class Program
{
    public void Main()
    {
        S s = new S();
        s.ListOfTs.Add(new T());
        s.ListOfTs.Add(new T());
        XmlSerializer serializer = new XmlSerializer(typeof(S));
        serializer.Serialize(new StringWriter(), s);
    }
}

シリアル化に「シリアル化/逆シリアル化するときListOfTsのインスタンスを想定する」という定義の上に配置できる属性があることを願っています。List<T>

4

3 に答える 3

13

変更

public IList<T> ListOfTs { get; set; }

public List<T> ListOfTs { get; set; }

その後、それは動作します。

于 2012-04-04T14:08:17.267 に答える
3

この種の問題に対して一般的にアプローチされる方法は2つあると思います。

1つはDataContractSerializerを使用することですが、すでにXmlSerializerを使用しているため、おそらくそれを使用したくないでしょう。

「代替」とは、特にシリアル化の目的で使用されるプロパティを持ち、シリアル化中にIListを無視することです。

[Serializable]
public class S
{
    IList<T> _listofTs;

    [XmlIgnore]
    public IList<T> ListOfTs { get _listofTs; set _listofTs = value; }

    [XmlElement(Name="Not Exactly the Greatest Solution!")]
    public List<T> ListOfTs { get _listofTs; set _listofTs = value; }

    public S()
    {
        ListOfTs = new List<T>();
    }
}
于 2012-04-04T14:16:19.547 に答える
0

IXmlSerializableXml リーダーとライターを使用して、インターフェイスを実装し、シリアル化ロジックを手動で実装できます。

于 2012-04-04T14:12:20.183 に答える