如何使序列化器忽略列表中项目的类名?



我有一个类,在其他属性中,有一个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序列化,每个属性上只有一个XmlElement属性。

任何想法吗?

谢谢。

编辑:如果你指的是xDaevax善意发布的链接,这不是重复的。(XML序列化-禁用呈现数组的根元素)。这个问题/答案并不是问/解决如何去掉项目类名(列表中每个项目周围的标签),它展示了如何去掉包含整个项目列表的整体列表标签。我想要的正好相反。如果有另一个链接到类似的,已回答的问题,我很想知道。谢谢你。

如果你有一个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")

所以,我做了一些很粗糙的东西,但它有效,我想这就是最重要的。我将PropA更改为int,因为它始终是一个数字,并使用以下标记设置我希望XML序列化器使用的特殊属性。我使用了塞尔曼的一些建议来简化这个过程。(谢谢!)

如果你的属性都是相同的类型,这个解决方案将不起作用,不幸的是,但它满足了我目前的需求,我们没有预见到任何改变的可能性(很少)。

[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 { }
}

相关内容

最新更新