【问题标题】:Xml Deserialize Class with property object带有属性对象的 XML 反序列化类
【发布时间】:2018-01-19 08:23:36
【问题描述】:

我想知道如何从 XML 反序列化为一个包含可能是 ARS 或 BRS 类的对象的类

ARS 和 BRS 是从 XSD 文件生成的 由于 ARS 和 BRS 都包含属性 C,所以当 new Serializer 时它会失败

错误: System.InvalidOperationException: '有一个错误反映类型'TestXml.Response'。'

InvalidOperationException:类型“B.C”和“A.C”都使用命名空间“”中的 XML 类型名称“C”。使用 XML 属性为类型指定唯一的 XML 名称和/或命名空间。

我尝试将命名空间添加到 ARS.C 和 BRS.C 但由于响应不包含命名空间,它返回 null

任何建议都会有所帮助,谢谢。

父类“响应”

namespace TestXml
{
    [XmlRoot(Namespace="")]
    public class Response
    {
        [XmlElement(ElementName = "ARS", Type = typeof(ARS))]
        [XmlElement(ElementName = "BRS", Type = typeof(BRS))]
        public object Object;
    }
}

类 ARS

namespace A
{
    public class ARS
    {
        public int a;
        public C c;
    }

    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
    public class C
    {
        public string d;
    }
}

类 BRS

namespace B
{
    public class BRS
    {
        public int b;
        public C c;
    }

    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
    public class C
    {
        public int e;
    }
}

通过 XmlSerializer 反序列化

string ooo = @"<Response xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema""><ARS><a>1</a><c><d>ca</d></c></ARS></Response>";

 XDocument xDoc = XDocument.Parse(ooo);
 XmlSerializer ser = new XmlSerializer(typeof(Response));

 using (var reader = xDoc.CreateReader(System.Xml.Linq.ReaderOptions.OmitDuplicateNamespaces))
 {
        Response deserializedObject = (Response)ser.Deserialize(reader);
 }

【问题讨论】:

  • 把戏。如果您无法将放入的数据反序列化到类中并进行序列化。然后将序列化 xml 与您尝试反序列化的 xml 进行比较并查看差异。
  • 感谢您的回复请求添加了命名空间以区分两个类,例如[System.Xml.Serialization.XmlRootAttribute(Namespace = "A", IsNullable = false)] public class C { public string d;由于 web 服务提供者忽略了请求中的命名空间,所以没关系。但是响应中不包含命名空间“A”,因此无法反序列化
  • 为什么要关心命名空间。序列化/反序列化仅使用标签名称。如果类名和 xml 标记不匹配,请使用 ElementName 属性。 : [XmlRoot(ElementName = "A")] public class ARS { } XmlRoot 可以放在任何类之前以更改名称。不仅仅是 XML 的根。
  • 谢谢jdweng。第一,对于元素名称,Web 服务是由我无法控制的供应商创建的。反应不在我的控制之下。如果 ElementName 更改,则无法序列化对象 ARS。
  • 第二,对于命名空间,当 ARS 和 BRS 中的 C 类中的命名空间都设置为“”即 [XmlRootAttribute(Namespace = "", IsNullable = false)] 时,在创建 XmlSerialize 期间发生错误public class C 但是,如果设置为不同的命名空间 [System.Xml.Serialization.XmlRootAttribute(Namespace = "A", IsNullable = false)] 对于 ARS 的 C [XmlRootAttribute(Namespace = "B", IsNullable = false)] BRS 的 C C 的内容为空,我猜是因为命名空间不匹配,在这两种情况下我都无法获得正确的响应对象 ARS,其中包含属性 C。

标签: c# xml object serialization


【解决方案1】:

我终于用xml linq先把响应字符串的子部分提取出来,然后一个一个反序列化,这样冲突就不存在了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    相关资源
    最近更新 更多