在.net 2.0中修改了类的序列化

时间:2013-09-23 12:54:16

标签: c# xml xml-serialization

让我说我有这个模型

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创建一个不同的模型..

2 个答案:

答案 0 :(得分: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. 您的表示层不应该取决于您存储数据的方式,而是相反。如果这两者相互影响 - 你的设计可能过于耦合。
  3. <强>更新

    刚刚注意到.net 2.0的限制。 DataContractSerializer需要.net 3.0及更高版本。

答案 1 :(得分: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();
    }
}