将类序列化为单个无属性元素,其内容设置为一个属性

Posted

技术标签:

【中文标题】将类序列化为单个无属性元素,其内容设置为一个属性【英文标题】:Serialze class as single attribute-less element with its content set to one property 【发布时间】:2012-02-13 15:34:24 【问题描述】:

我想序列化/反序列化以下类型:

// The "NameEntity" element shouldn't appear in the XML
public class NameEntity

    [XmlElement("name")]
    public string Name  get; set; 


[XmlRoot("names")]
public class Names : List<NameEntity>


我希望序列化的 XML 匹配以下方案:

<?xml version="1.0" encoding="utf-8" ?>
<names>
  <name>Charlie</name>
  <name>Robert</name>
  <name>Nick</name>
</names>

其实输出的XML是:

<names>
  <NameEntity>
    <name>Charlie</name>
  </NameEntity>
  ...
</names>

这是否可以通过 .NET 中的 XML 属性之一实现,或者我必须实现 IXmlSerializable

【问题讨论】:

【参考方案1】:

您需要XmlType Attribute 和XmlText Attribute 的混合,就像这样......

// The "NameEntity" element shouldn't appear in the XML
[XmlType("name")]
public class NameEntity

    [XmlText]
    public string Name  get; set; 


[XmlRoot("names")]
public class Names : List<NameEntity>



public class SO

    [Test]
    public void NameEntitySerialization()
    
        var name = new NameEntity()  Name = "Austin" ;

        var serialized = <YOUR SERIALIZATION CODE HERE>
        Console.WriteLine(serialized);
        Assert.AreEqual("<name>Austin</name>", serialized);
    

    [Test]
    public void ListSerialization()
    
        var names = new Names();
        names.Add(new NameEntity() Name = "Austin");

        var serialized = <YOUR SERIALIZATION CODE HERE>
        Console.WriteLine(serialized);
        Assert.AreEqual("<names>\r\n  <name>Austin</name>\r\n</names>",
          serialized);
    

【讨论】:

@Shimmy:你是否也添加了[XmlText] 属性。那些测试通过了......(发布失败的测试是愚蠢的) MY BAD sorry :'( 我确实用XmlText att. 装饰了Name 属性,但我忘记从之前删除XmlElement 仍然保留在那里(还有一堆其他验证属性和其他,我没有注意到它)...谢谢!

以上是关于将类序列化为单个无属性元素,其内容设置为一个属性的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 XSD 中定义为属性时,自动生成的类中的字段会序列化为元素?

如何使用 Windows Phone 8 SDK 将类序列化为 XML?

在 symfony JMS PHP 中将单个字符串属性反序列化为对象

将属性序列化为元素中的 Xml 属性

将类序列化为 .json 文件

XML 反序列化:在单个属性上使用 XmlAttribute 和 XmlText