DataContractSerializer 反序列化没有命名空间的成员?

2024-04-30

我需要反序列化这个 xml(我无法更改):

<foo:a xmlns:foo="http://example.com">
  <b>string</b>
</foo:a>

我做了这堂课:

[DataContract(Name = "a", Namespace = "http://example.com")]
public class A
{
    [DataMember(Name = "b", Order = 0)]
    public string B;
}

我做了:

using (var streamObject = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
{
    var ser = new DataContractSerializer(typeof(A));
    return (A)ser.ReadObject(streamObject);
}

我得到一个 A 类的对象,但 B 类的内容始终为空。我知道如果 xml 使用的话它会起作用<foo:b>string</foo:b>, 但事实并非如此。如何反序列化没有命名空间的 DataMember?


如果您可以在反序列化之前对 xml 进行预处理,那么请尝试执行以下操作:

将数据合约中的命名空间设为空:

[DataContract(Name = "a", Namespace = "")]
public class A
{
    [DataMember(Name = "b", Order = 0)]
    public string B;
}

在反序列化之前从 xml 中删除名称空间属性

XDocument doc = XDocument.Parse("your xml here");
XElement root = doc.Root;

XAttribute attr = root.Attribute("xmlns");
if (attr != null) 
{
    attr.Remove();
}

然后反序列化更新后的xml:

string newXml = doc.ToString();   

A result = null;
DataContractSerializer serializer = new DataContractSerializer(typeof(A));

using (StringReader backing = new StringReader(newXml))
{
    using (XmlTextReader reader = new XmlTextReader(backing))
    {
        result = (A) serializer.ReadObject(reader);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DataContractSerializer 反序列化没有命名空间的成员? 的相关文章

随机推荐