【问题标题】:Serializing Enum type emits different element name序列化枚举类型发出不同的元素名称
【发布时间】:2013-06-04 01:11:24
【问题描述】:

致力于 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>

【问题讨论】:

  • 您能否说明您正在尝试什么以及为什么它没有按预期工作?很难看出你到底在问什么。
  • 您能否也显示示例类(或多个类) - 不清楚您是否要使用 Enum 对一个特定类或所有类进行更改。
  • 为什么不将枚举中的第一个值设为=1,其余的将进入ordinal 序列?另外,你是如何序列化枚举的?你有那个代码还是你希望有人为你写那个..?
  • 更新了问题,如果需要更多信息,请告诉我
  • 现在,您收到的是&lt;MyEnums&gt;&lt;MyEnum&gt;One&lt;/MyEnum&gt;&lt;/MyEnums&gt; 而不是&lt;MyEnums&gt;&lt;ModifiedElementName&gt;One&lt;/ModifiedElementName&gt;&lt;/MyEnums&gt;

标签: c# .net xmlserializer


【解决方案1】:

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

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>

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

【讨论】:

    【解决方案2】:

    您可以使用[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()));
        }
    

    【讨论】:

    • 啊,您的回答显示了如何修改每个属性,而不是每个类型(如我的回答)。哪个更好取决于情况,很可能这就是你的答案。
    猜你喜欢
    • 2013-11-28
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2019-02-01
    相关资源
    最近更新 更多