c#xml序列化自定义elementName

时间:2012-01-02 12:18:50

标签: c# xml serialization xmlserializer

我正在尝试将类对象序列化为xml,如下所示:

<Colors>
<Blue>
  <R>0,000</R>
  <G>0,000</G>
  <B>1,000</B>
  <A>1,000</A>
</Blue>
<Red>
  <R>1,000</R>
  <G>0,000</G>
  <B>0,000</B>
  <A>1,000</A>
</Red></Colors>

重要的是,蓝色和红色不直接指定。我有一个这样的课:

public class Color
{
    [XmlElement("R")]
    public string red;

    [XmlElement("G")]
    public string green;

    [XmlElement("B")]
    public string blue;

    [XmlElement("A")]
    public string alpha;
}

我需要的是一种创建Color类对象实例的方法,并使用blue, red, green, anothercolor1, anothercolor2, ...之类的不同名称对它们进行序列化 在程序运行时,它必须能够动态地添加新颜色。

我知道我可以为Color类添加属性但是我无法改变xml的布局,所以我必须找到另一种方法。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

最好的办法是将反射用于Color类的get all the properties并迭代它们:

public void SerializeAllColors()
{
    Type colorType = typeof(System.Drawing.Color);
    PropertyInfo[] properties = colorType.GetProperties(BindingFlags.Public | BindingFlags.Static);
    foreach (PropertyInfo p in properties)
    {
        string name = p.Name;
        Color c = p.GetGetMethod().Invoke(null, null);

        //do your serialization with name and color here
    }
}

编辑:如果您无法控制更改XML格式并且您知道格式不会更改,您还可以自己对序列化进行硬编码:

在foreach循环之外:

string file = "<Colors>\n";

在循环中:

file += "\t<" + name + ">\n";
file += "\t\t<R>" + color.R.ToString() + "</R>\n";
file += "\t\t<G>" + color.G.ToString() + "</G>\n";
file += "\t\t<B>" + color.B.ToString() + "</B>\n";
file += "\t\t<A>" + color.A.ToString() + "</A>\n";
file += "\t</" + name + ">\n";

最后:

file += "</Colors>"
using (StreamWriter writer = new StreamWriter(@"colors.xml"))
{
    writer.Write(file);
}

\n替换为\r\n或将Environment.NewLine替换为