3

タイプ のオブジェクトを含むリストを xml にシリアル化する必要がありますPair<T,U>。これらの値に加えて、そのジェネリックの型 ( と の型) もシリアル化する必要がありTますU

まず、ペアのリストを保持するクラス PairList を作成し、次にキーと値の 2 つの値のペアを表す実際のクラスを作成しました。

 [XmlRoot("pairList")]
        public class PairList<T,U>{
            [XmlElement("element")]
            public List<Pair<T,U>> list;
            public PairList()
            {
                list = new List<Pair<T, U>>();
            }

        }
        public class Pair<T, U>
        {
            [XmlAttribute("key")]
            public T key;
            [XmlAttribute("value")]
            public U value;
            [XmlAttribute("T-Type")]
            public Type ttype;
            [XmlAttribute("U-Type")]
            public Type utype;

            public Pair()
            {
            }
            public Pair(T t, U u)
            {
                key = t;
                value = u;
                ttype = typeof(T);
                utype = typeof(U);
            }
        }

次に、シリアル化してみました。

 PairList<string,int> myList = new PairList<string,int>();
            myList.list.Add(new Pair<string, int>("c", 2));
            myList.list.Add(new Pair<string, int>("c", 2));
            myList.list.Add(new Pair<string, int>("c", 2));
            myList.list.Add(new Pair<string, int>("c", 2));
            try
            {
                XmlSerializer serializer = new XmlSerializer(typeof(PairList<string, int>));
                TextWriter tw = new StreamWriter("list.xml");
                serializer.Serialize(tw, myList);
                tw.Close();
            }
            catch (Exception xe)
            {
                MessageBox.Show(xe.Message);
            }

残念ながら、例外が発生しています: There was an error reflecting type: PairList[System.String,System.Int32]。この例外を回避してクラスをシリアル化する方法についてのアイデアは大歓迎です。

ttypeフィールドとフィールドをシリアル化しないことを選択した場合utype(保護またはプライベートにすることにより)、シリアル化は機能します。Typeフィールドをシリアライズしたくない理由がわかりません。

4

1 に答える 1

0

クラスを次のように変更します

public class Pair<T, U>
{
    [XmlAttribute("key")]
    public T key;
    [XmlAttribute("value")]
    public U value;
    [XmlAttribute("T-Type")]
    public string ttype;
    [XmlAttribute("U-Type")]
    public string utype;

    public Pair()
    {
    }
    public Pair(T t, U u)
    {
        key = t;
        value = u;
        ttype = typeof(T).ToString();
        utype = typeof(U).ToString();
    }
}

そしてそれはうまくいくはずです。を使用してシリアル化/逆シリアル化することはできませんType(Xmlserializerたとえば、Tが外部アセンブリで定義された複雑なオブジェクトであり、このアセンブリが逆シリアル化するコンピューターに存在しないとします)。

于 2013-06-09T16:30:17.853 に答える