0

私がこのモデルを持っているとしましょう

class Color
{
    string name;
    string type;
}

Class ColorsList
{
List<Color>;
}

これらのクラスをxmlに入力する必要があります

<ColorsList>
    <Color>red
        <type>brush</type>
    </Color>
    <Color>blue
        <type>spray</type>
    </Color>
</ColorsList>

グリッド コントロールにバインドできるように、クラス構造の原因を変更することはできません。

そのようなことのベストプラクティスは何ですか? それを行う簡単な方法はありますか?XML用に別のモデルを作成することを考えていました..

4

2 に答える 2

1

プロパティが public の場合、XmlSerializer と DataContractSerializer の両方を使用できます。それらは、あなたが説明したよりも大きくて醜い XML を作成します。

非パブリック プロパティをシリアル化する必要がある場合でも、DataContractSerializer (プロパティの内部セッターをシリアル化できますか? ) を使用できます。

使用例 -

http://msdn.microsoft.com/en-us/library/bb675198.aspx

http://www.jonasjohn.de/snippets/csharp/xmlserializer-example.htm

2 メモ -

  1. これらのシリアライザーは低速です。数十または数百のシリアライザーを保存する場合、問題にはなりません。これらのアイテムを大量に処理する予定がある場合は、問題になる可能性があります。バイナリ シリアライザー (.net \ protobuf.net \ protosharp にあるもの) を使用するか、独自の XML シリアライザーを作成できます。
  2. プレゼンテーション層は、データを保存する方法とその逆に依存するべきではありません。これら 2 つが互いに影響し合う場合、設計が結合しすぎている可能性があります。

アップデート

.net 2.0 の制限に気付きました。DataContractSerializer には .net 3.0 以降が必要です。

于 2013-09-23T13:41:26.743 に答える
0

それが本当に関係ない場合は、例から XmlWriterSettings と XmlSerializerNamespaces を取り除きます。

public class Color
{
    [XmlText]
    public string Name { get; set; }
    [XmlElement(ElementName = "type")]
    public string Type { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        List<Color> colorlist = new List<Color>();
        colorlist.Add(new Color() { Name = "red", Type = "brush" });
        colorlist.Add(new Color() { Name = "blue", Type = "spray" });

        XmlWriterSettings xws = new XmlWriterSettings();            
        xws.OmitXmlDeclaration = true;
        xws.Encoding = Encoding.UTF8;
        xws.Indent = true;

        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("", "");

        StringBuilder output = new StringBuilder();
        using(var wr = XmlWriter.Create(output, xws))
        {
            XmlSerializer ser = new XmlSerializer(typeof(List<Color>), new XmlRootAttribute("ColorsList"));
            ser.Serialize(wr, colorlist, ns);
        }

        Console.WriteLine(output.ToString());
        Console.ReadLine();
    }
}
于 2013-09-23T13:29:53.717 に答える