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

如果属性是公共的,则可以使用 XmlSerializer 和 DataContractSerializer。他们将创建一个比您描述的更大、更丑陋的 XML。

如果您必须序列化非公共属性,您仍然可以使用 DataContractSerializer ( Can an internal setter of a property be serialized? )。

使用示例 -

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. 您的表示层不应依赖于您存储数据的方式,反之亦然。如果这两者相互影响 - 您的设计可能过于耦合。

更新

刚刚注意到 .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 回答