首页 > 解决方案 > 混合类型属性序列化为 C# 中的 xml

问题描述

例如我有三个班级

public class A
{
    public string Abc { get; set; }
}

public class B
{
    public string Xyz { get; set; }
}

public class C
{
    private object itemField;

    [XmlElement("A", typeof(A))]
    [XmlElement("B", typeof(B))]
    public object Item
    {
        get
        {
            return itemField;
        }
        set
        {
            itemField = value;
        }
    }
}

我正在尝试序列化 C 类的一个实例

var b = new B
{
    Xyz = "123123"
};
var c = new C
{
    Item = b
};
var serializer = new XmlSerializer<C>();
var aaa = serializer.Serialize(c);

然后输出是

-C
-- A
---
Xyz ----123123
---/ Xyz
-- /A
-/C

但我期待

-C
-- B
---
Xyz ----123123
---/ Xyz
-- /B
-/C

我怎样才能做到这一点?(我将 amazon mws xsd 转换为带有 xsd.exe 的类,并且一些输出类类似于 C 类,所以我在尝试序列化这些类时遇到了麻烦。)

我正在使用 net framework 4.6.1 和序列化 XSerializer( nuget.org/packages/XSerializer/0.4.2 )。

*** 编辑:我发现了问题,问题不在于序列化程序。“xsd.exe”在转换 xsd 文件时在多维数组上出错。我编辑了序列化属性的类并且它起作用了。例子:

// I changed "[XmlArrayItem("Name", typeof(TypeName))]" To that: 
[XmlArrayItem("Name", typeof(TypeName[]))]
public TypeName[][] PropName { get; set; }

谢谢大家

标签: c#xmlserializationxsdamazon-mws

解决方案


我得到了想要的结果XmlSerializer。命名空间System.Xml.Serialization

var writer = new XmlSerializer(typeof(C));
var file = File.Create(strfilepath);
writer.Serialize(file, c);
file.Close();

输出

<?xml version="1.0"?>
<C xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <B>
    <Xyz>123123</Xyz>
  </B>
</C>

推荐阅读