C# XML序列化自定义元素名称

4

我正在尝试将一个类对象序列化为以下类似的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的布局,因此必须找到另一种方法。 有什么想法吗?

而您要如何/在哪里存储名称呢?它必须使用特定的序列化程序吗? - H H
1
提供的XML文件没有意义,应该是<Colors><Color Name="Red">..</Color></Colors> - Bas
@HenkHolterman:目前我没有存储这些名称,如果需要的话,我会在颜色类中进行存储。我也考虑过使用第二个类,并创建一个sortedlist<string name,Color color>,其中包含颜色类对象和名称,但我无法序列化sortedlist,或者我错过了什么吗? - Benedikt H.
@BasB:我知道这个XML没有意义。我会按照你描述的方式去做,但是我不能改变XML的布局。 - Benedikt H.
亲爱的Benedikt H.,您想将XML文本更改为可读格式吗?如果是的话,您可以尝试在将字符串写入文本之前使用xmlTextWriter.Formatting = Formatting.Indented; xmlTextWriter.Indentation = 3;。 - JKhuang
1个回答

0

你最好使用反射来获取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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接