【问题标题】:mixed type property serialization to xml in C#混合类型属性序列化为 C# 中的 xml
【发布时间】:2020-01-10 13:37:10
【问题描述】:

例如我有三个类

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; }

谢谢大家

【问题讨论】:

  • 类被另一个类继承时使用的类型。所以你需要 1) public class A : C 2) public class B: C
  • 什么是XmlSerializer&lt;T&gt;?请参阅minimal reproducible example
  • 我已经在“公共对象项”属性上使用了 [XmlElement("",typeof())]。我需要通过它的类型名称序列化“项目”属性。 (如果“项目”的类型是 A 则 A 标记,当类型 B 则 B 标记等不是项目标记)
  • @Sinatr 对不起,我的错。我正在使用 net framework 4.6.1 和序列化 XSerializer(nuget.org/packages/XSerializer/0.4.2)
  • 那么这可能是XSerializer 的错误。如果我使用 .Net 中内置的 XmlSerializer 序列化您的课程,那么我会得到想要的结果,请参阅 dotnetfiddle.net/rHGcux

标签: c# xml serialization xsd amazon-mws


【解决方案1】:

我不知道那个 nuget,但是没有 nuget 的序列化(我使用了来自 this post 的扩展方法):

var test = SerializeObject<C>(c);

产生预期的结果

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

【讨论】:

    【解决方案2】:

    我通过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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      相关资源
      最近更新 更多