Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XmlArray序列化-如何使序列化程序忽略列表中项的类名?_C#_Xml_Serialization_Classname - Fatal编程技术网

C# XmlArray序列化-如何使序列化程序忽略列表中项的类名?

C# XmlArray序列化-如何使序列化程序忽略列表中项的类名?,c#,xml,serialization,classname,C#,Xml,Serialization,Classname,我有一个类,在其他属性中,有一个MyObject列表 public class MyClass { ... [XmlArray("OBJECT")] public List<MyObject> Objects { get; set; } ... } XML序列化程序返回以下XML: <OBJECT> <MyObject> <PropA>A1</PropA> &

我有一个类,在其他属性中,有一个MyObject列表

public class MyClass
{
    ...

    [XmlArray("OBJECT")]
    public List<MyObject> Objects { 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>

A1
地下一层
A2
地下二层
A3
地下三层
我给出的要求是让它看起来像这样(我发誓,考虑到真实的对象名和属性值,它看起来没有那么错误,但无论如何,这是我的任务):


A1
地下一层
A2
地下二层
A3
地下三层
实现这一目标的最佳方式是什么?我尝试过处理各种Xml属性(例如XmlArrayItem、XmlElement),但似乎无法摆脱类名包装器

我曾考虑过自定义xml序列化,但我不想放弃所有(工作)默认xml序列化,这些序列化发生在其他属性上,每个属性上只有一个XmlElement属性

有什么想法吗

多谢各位


编辑:如果您指的是xDaevax善意发布的链接,则这不是重复的。(). 这个问题/答案并不是询问/解决如何去掉项目类名称(列表中每个项目周围的标记),而是说明如何去掉包含整个项目列表的整个列表标记。我要的恰恰相反。如果有其他类似的链接,我很想知道。谢谢。

如果您有一个
MyObject
的集合,您可以使用以下工具轻松完成此操作:


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

不幸的是,如果您的酒店都是同一类型,这个解决方案将不起作用,但它目前满足了我的需求,我们预计不会有任何潜在的变化(尽管这种情况很少见)

[XmlIgnore]
公共列表对象{get;set;}
[XmlArray(ElementName=“OBJECT”)]
[XmlArrayItem(Type=typeof(int),ElementName=“PROPA”)]
[XmlArrayItem(Type=typeof(string),ElementName=“PROPB”)]
公共列表对象
{
得到
{
var xmlObjects=new List();
如果(对象!=null)
{
AddRange(Objects.SelectMany(x=>新列表
{
x、 普罗帕,
x、 道具
}));
}
返回xml对象;
}
集合{}
}

我想这里已经回答了这个问题:不幸的是没有。与我的问题相关,这个解决方案只去掉了对象标记,而不是MyObject标记。不过,谢谢你。我喜欢这种简单性(一定很喜欢LINQ),但我无法将此链接保存到文件路径,如果我尝试使用它,它仍然会丢失其余的属性序列化。尝试使用:[XmlArray(“OBJECT”)]public List XmlOjects{get{return Objects.SelectMany(x=>newlist{new-XElement(“PropA”,x.PropA),new-XElement(“PropB”,x.PropB),}).ToList();}set{}}但它只是用XElement标记替换了MyObject标记。
<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>
var xDoc = new XDocument("OBJECT",
        myObjects
        .SelectMany(x => new[]
        {
            new XElement("PropA", x.PropA),
            new XElement("PropB", x.PropB)
        }));

xDoc.Save("path")
[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 { }
}