c# xml序列化自定义元素名称

本文关键字:元素 自定义 xml 序列化 | 更新日期: 2023-09-27 18:19:17

我正在尝试将一个类对象序列化为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的布局,所以我必须找到另一种方法。

任何想法?

c# xml序列化自定义元素名称

最好的方法是使用反射来获取Color类的所有属性并遍历它们:

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'nEnvironment.NewLine