XmlArray 序列化 - 如何让序列化程序忽略列表中项目的类名?
Posted
技术标签:
【中文标题】XmlArray 序列化 - 如何让序列化程序忽略列表中项目的类名?【英文标题】:XmlArray Serialization - How can I make the serializer ignore the class name of items in a list? 【发布时间】:2014-07-18 02:54:38 【问题描述】:我有一个类,除其他属性外,还有一个 MyObject 列表。
public class MyClass
...
[XmlArray("OBJECT")]
public List<MyObject> Objects get; set;
...
每个 MyObject 都有两个属性,PropA 和 PropB。
public class MyObject
public string PropA get;set;
public string PropB get;set;
XML 序列化器返回这个 XML:
<OBJECT>
<MyObject>
<PropA>A1</PropA>
<PropB>B1</PropB>
</MyObject>
<MyObject>
<PropA>A2</PropA>
<PropB>B2</PropB>
</MyObject>
<MyObject>
<PropA>A3</PropA>
<PropB>B3</PropB>
</MyObject>
</OBJECT>
我给定的要求是让它看起来像这样(我发誓,考虑到真实的对象名称和属性值,它看起来不太错误,但无论如何,这是我的任务):
<OBJECT>
<PropA>A1</PropA>
<PropB>B1</PropB>
<PropA>A2</PropA>
<PropB>B2</PropB>
<PropA>A3</PropA>
<PropB>B3</PropB>
</OBJECT>
实现这一目标的最佳方法是什么?我尝试使用各种 Xml 属性(例如 XmlArrayItem、XmlElement),但我似乎无法摆脱类名包装器。
我考虑过自定义 xml 序列化,但我不想丢弃所有(工作)默认 Xml 序列化,这些默认 Xml 序列化发生在其他属性上,每个属性上只有一个 XmlElement 属性。
有什么想法吗?
谢谢。
编辑:如果您指的是 xDaevax 友好发布的链接,这不是重复的。 (XML Serialization - Disable rendering root element of array)。这个问题/答案不是询问/解决如何摆脱项目类名称(列表中每个项目周围的标签),它显示了如何摆脱包含整个项目列表的整体列表标签。我想要恰恰相反。如果有另一个链接指向类似的已回答问题,我很想知道。谢谢。
【问题讨论】:
我认为这里已经回答了这个问题:***.com/questions/2006482/… 很遗憾没有。与我的问题相关,这个解决方案只去掉了 OBJECT 标签,而不是 MyObject 标签。不过,谢谢。 【参考方案1】:所以,我做了一些非常老套的事情,但它确实有效,我想这才是最重要的。我将 PropA 更改为 int,因为它始终是一个数字,并使用以下标签来设置我希望 XML 序列化程序使用的特殊属性。我使用了 Selman22 的一些建议来简化它。 (谢谢!)
不幸的是,如果您的属性都是相同的类型,则此解决方案将不起作用,但它目前满足我的需求,我们预计不会有任何更改的可能性(这种情况很少见)。
[XmlIgnore]
public List<MyObject> Objects get; set;
[XmlArray(ElementName = "OBJECT")]
[XmlArrayItem(Type = typeof(int), ElementName = "PROPA")]
[XmlArrayItem(Type = typeof(string), ElementName = "PROPB")]
public List<object> XmlObjects
get
var xmlObjects = new List<object>();
if (Objects != null)
xmlObjects.AddRange(Objects.SelectMany(x => new List<object>
x.PropA,
x.PropB
));
return xmlObjects;
set
【讨论】:
【参考方案2】:如果您有MyObject
的集合,您可以使用LINQ to XML
轻松做到这一点:
var xDoc = new XDocument("OBJECT",
myObjects
.SelectMany(x => new[]
new XElement("PropA", x.PropA),
new XElement("PropB", x.PropB)
));
xDoc.Save("path")
【讨论】:
我喜欢简单(一定喜欢 LINQ),但我无法将此链接保存到文件路径,如果我尝试使用它,它仍然会丢失其余的属性序列化。 尝试使用:[XmlArray("OBJECT")] public List以上是关于XmlArray 序列化 - 如何让序列化程序忽略列表中项目的类名?的主要内容,如果未能解决你的问题,请参考以下文章