将类序列化为单个无属性元素,其内容设置为一个属性
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?