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 XmlOjects get return Objects.SelectMany(x => new List new XElement("PropA", x .PropA), new XElement("PropB", x.PropB), ).ToList(); set 但它只是用 XElement 标签替换了 MyObject 标签。

以上是关于XmlArray 序列化 - 如何让序列化程序忽略列表中项目的类名?的主要内容,如果未能解决你的问题,请参考以下文章

对象序列和反序列化Xml

如何让 Json.Net 在不忽略子属性的情况下从 documentDB 序列化/反序列化动态/通用对象?

JSON 序列化程序如何忽略导航属性?

JSON 序列化程序如何忽略导航属性?

如何将重复的 XML 元素序列化为数组?

在 xml 序列化期间忽略属性,但在反序列化期间不忽略