gpt4 book ai didi

c# - 为什么 XML 序列化程序在使用 namespace 的对象反序列化时返回 null?

转载 作者:太空宇宙 更新时间:2023-11-03 19:40:13 30 4
gpt4 key购买 nike

我有这个案例:

    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public class Response
{
public string RetKey { get; set; }
public string RetType { get; set; }
}

[Test]
public void Test3()
{
{
var s = @"<Response CommandID=""57b48ae28f484ab4b3cc2e841cddd02a"">
<RetKey>5</RetKey>
<RetType>152</RetType>
</Response>";

var xmlSerializer = new XmlSerializer(typeof(Response));
var deserialize = (Response)xmlSerializer.Deserialize(new StringReader(s));

Assert.AreEqual("5", deserialize.RetKey, "no namespace");
}

{
var s = @"<Response xmlns=""http://www.sap.com/SBO/DIS"" CommandID=""57b48ae28f484ab4b3cc2e841cddd02a"">
<RetKey>5</RetKey>
<RetType>152</RetType>
</Response>";

var xRoot = new XmlRootAttribute
{
ElementName = typeof(Response).Name,
Namespace = "http://www.sap.com/SBO/DIS",
IsNullable = true
};

var xmlSerializer = new XmlSerializer(typeof(Response), xRoot);
var deserialize = (Response)xmlSerializer.Deserialize(new StringReader(s));

Assert.AreEqual("5", deserialize.RetKey, "try to declare namespaces");
}
}

第二次尝试失败(使用命名空间)。所以我坚持在 xml 反序列化中正确使用 namespace 。让我感到困惑的是,反序列化过程没有错误,但返回空对象。

我错过了什么?

最佳答案

第二个版本的xml完全不同,所以失败是正确的。命名空间是 xml 节点标识的基础。如果你想让第二个版本工作,你需要告诉它 Namespace="http://www.sap.com/SBO/DIS" 在所有相关的 [Xml ...] 属性,注意 xmlns="..." 被子元素继承。这意味着您还需要告诉它 RetKeyRetType 在该命名空间中。

如果你想在运行时定义它,那么:

var xRoot = new XmlRootAttribute
{
ElementName = nameof(Response),
Namespace = "http://www.sap.com/SBO/DIS",
IsNullable = true
};
var xor = new XmlAttributeOverrides();
xor.Add(typeof(Response), nameof(Response.RetKey), new XmlAttributes
{
XmlElements = { new XmlElementAttribute(nameof(Response.RetKey))
{ Namespace = xRoot.Namespace } }
});
xor.Add(typeof(Response), nameof(Response.RetType), new XmlAttributes
{
XmlElements = { new XmlElementAttribute(nameof(Response.RetType))
{ Namespace = xRoot.Namespace } }
});
var xmlSerializer = new XmlSerializer(typeof(Response),
xor, Type.EmptyTypes, xRoot, xRoot.Namespace);

但是,请注意,当您以这种方式创建 XmlSerializer 时,您必须缓存并重用它 - 每次您时它都会生成一个新程序集>new XmlSerializer(...) 就像这样,很快就会变得非常昂贵。所以:把它存放在某个地方!或者只使用属性(它在使用简单构造函数时在内部缓存)。

关于c# - 为什么 XML 序列化程序在使用 namespace 的对象反序列化时返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54520242/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com