序列化枚举类型会发出不同的元素名称

时间:2013-06-03 16:56:01

标签: c# .net xmlserializer

处理XML序列化。序列化枚举类型时,要更改它的xml元素名称。任何帮助将不胜感激。

我正在使用.Net xml序列化来序列化这个对象并产生下面的xml输出

<MyEnums>   <MyEnum>One</MyEnum>    <MyEnum>Two</MyEnum>    <MyEnum>Three</MyEnum></MyEnums>

这是班级

public class Request
{
        public List<MyEnum> MyEnums { get; set; }
}

这是我想要发出的XML

<MyEnums>
<ModifiedElementName>One</ModifiedElementName>
<ModifiedElementName>Two</ModifiedElementName>
<ModifiedElementName>Three</ModifiedElementName>

这是枚举类型

enum MyEnum
{
    One,
    Two,
    Three
}

期望输出为xml

<ModifiedElementName>One</ModifiedElementName>

2 个答案:

答案 0 :(得分:5)

您可以使用XmlType上的enum属性,如下所示:

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

namespace Scratch
{
    [XmlType("ModifiedEnumName")]
    public enum TestEnum
    {
        One,
        Two,
        Three,
    }

    public class TestClass
    {
        public TestClass()
        {
            MyEnums = new List<TestEnum>();
        }

        public List<TestEnum> MyEnums { get; set; }
    }

    static class Program
    {
        static void Main(string[] args)
        {
            using (var sw = new StringWriter())
            {
                new XmlSerializer(typeof(TestClass)).Serialize(sw, new TestClass { MyEnums = { TestEnum.Two } });
                Console.WriteLine(sw.GetStringBuilder());
            }
        }
    }
}

此输出

<?xml version="1.0" encoding="utf-16"?>
<TestClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <MyEnums>
    <ModifiedEnumName>Two</ModifiedEnumName>
  </MyEnums>
</TestClass>

编辑:这假设所有TestEnum都需要以相同的方式序列化。如果您希望能够为同一类型的不同属性指定不同的XML元素名称,请使用carlosfigueira的答案。

答案 1 :(得分:1)

您可以使用[XmlElement][XmlArray][XmlArrayItem]属性来获取所需内容。下面的示例使用最后两个来获得我认为您需要的内容,但可以随意与其他人一起使用以获得您想要输出的XML。

    public class Request
    {
        [XmlArray(ElementName = "MyEnums")]
        [XmlArrayItem(ElementName = "ModifiedElementName")]
        public List<MyEnum> MyEnums { get; set; }
    }

    public enum MyEnum
    {
        One,
        Two,
        Three
    }

    public static void Test()
    {
        XmlSerializer xs = new XmlSerializer(typeof(Request));
        MemoryStream ms = new MemoryStream();
        Request req = new Request
        { 
            MyEnums = new List<MyEnum>
            {
                MyEnum.One,
                MyEnum.Two,
                MyEnum.Three
            }
        };
        xs.Serialize(ms, req);
        Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
    }