我有这样的情况:
[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序列化正确使用的命名空间。是什么让我困惑,即反序列化着手没有错误,但返回空对象。
什么我失踪?
第二个版本的XML是完全不同的,所以它是正确的,它失败。命名空间是一个XML节点的身份根本。如果你想在第二个版本的工作,你需要告诉它Namespace="http://www.sap.com/SBO/DIS"
在所有相关[Xml...]
属性,并指出xmlns="..."
由子元素继承。这意味着你还需要告诉它RetKey
和RetType
在该命名空间。
如果你想在运行时确定这一点,那么:
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(...)
这样的时间,这会非常昂贵的非常快。所以:它存储在某处!或者只是使用属性(它使用简单构造,当内部缓存)。