1

私はしばらくこれに苦労してきました。これが私の状況です-シリアル化しようとしているクラスのプロパティの1つにIEnumerable(インターフェイスであるためシリアル化できません)が含まれており、プロパティを変更できません(属性を追加できません)それにどちらか)。これまでに得たコードは次のとおりです。

// Ignore the byte array containing the Data for the serialization
xmlAttrOverrides.Add(typeof (FileContent), "Data", xmlIgnoreAttr);

using (var writer = xmlDocument.CreateWriter())
{
    var serializableTypes = GetSerializableSubTypes();
    var serializer = new XmlSerializer(documentPackage.GetType(), xmlAttrOverrides, serializableTypes, null, null);

    serializer.Serialize(writer, documentPackage);
}

または が表示XmlSerializerされるたびにそれらをリスト(または配列)に「変換」するように設定する方法はありますか。どんな助けでも大歓迎です。IListIEnumerable

4

2 に答える 2

2

クラスを変更することはできないため、シリアル化するクラスと から継承する新しいクラスを作成しますIXmlSerializablenewさらに、ベースの Colors 配列をキーワードでオーバーライドできます。

これを試してください:

public class Something
{
    public int Id { get; set; }

    public string Text { get; set; }

    public IEnumerable<string> Colors { get; set; }
}

public class MySerializableSomething : Something, IXmlSerializable
{
    public new List<string> Colors { get; set; }

    public MySerializableSomething()
    {
        Colors = new List<string>();
    }

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        while (reader.Read())
        {
            switch (reader.LocalName)
            {
                case "Id": Id = reader.ReadElementContentAsInt(); break;
                case "Text": Text = reader.ReadElementContentAsString(); break;
                case "Color": Colors.Add(reader.ReadElementContentAsString()); break;
            }
        }
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteElementString("Id", Id.ToString());
        writer.WriteElementString("Text", Text);

        writer.WriteStartElement("Colors");

        foreach (var color in Colors)
        {
            writer.WriteElementString("Color", color);
        }

        writer.WriteEndElement();
    }
}

ここで、私が持っていることがわかりますIEnumerable<string>。通常は機能しません..なので、ラップしてから、ラップされたものをシリアル化します。必要に応じて、それを通常の基本クラスに変換できます..最善の解決策ではありませんが、基本クラスを変更できないと言ったので、ここには多くのオプションはありません...

于 2013-03-16T08:31:29.993 に答える
0

を実装して独自のカスタムXmlSerializerクラスを作成します。使用法についてはmsdnIXmlSerializableを参照してください。

于 2013-03-16T07:39:31.547 に答える