如何解决C# XmlSerializer 序列化具有不同命名空间的同一个类
假设我有一堂课:
using System.Xml;
using System.Xml.Serialization;
class Foo {
[XmlElement(ElementName="Bar")]
public string Bar {get; set;}
}
现在我想序列化它。但。我想指定不同的命名空间, 有一次我希望我的 XML 看起来像这样:
<Foo xmlns:v1="http://site1">
<v1:Bar />
</Foo>
另外一个 - 像这样:
<Foo xmlns:v2="http://site2">
<v2:Bar />
</Foo>
我知道我需要在 XmlElement 属性中指定命名空间,但这正是我想要避免的。 当然,我可以创建 2 个不同的类,除了字段属性外,它们都是相同的,但这不知何故感觉不对。 有什么办法可以强制 XmlSerializer 使用我在运行时选择的命名空间?
解决方法
是的; XmlAttributeOverrides
:
static void Main()
{
var obj = new Foo { Bar = "abc" };
GetSerializer("http://site1").Serialize(Console.Out,obj);
Console.WriteLine();
GetSerializer("http://site2").Serialize(Console.Out,obj);
}
static XmlSerializer GetSerializer(string barNamespace)
{
var ao = new XmlAttributeOverrides();
var a = new XmlAttributes();
a.XmlElements.Add(new XmlElementAttribute { Namespace = barNamespace });
ao.Add(typeof(Foo),nameof(Foo.Bar),a);
return new XmlSerializer(typeof(Foo),ao);
}
但是!!!
当你这样做时,它每次都会在内存中生成一个额外的程序集;您必须缓存并重用序列化器实例——通常是通过并发字典或类似的。例如:
private static readonly ConcurrentDictionary<string,XmlSerializer>
s_serializersByNamespace = new();
static XmlSerializer GetSerializer(string barNamespace)
{
if (!s_serializersByNamespace.TryGetValue(barNamespace,out var serializer))
{
lock (s_serializersByNamespace)
{
// double-checked,avoid dups
if (!s_serializersByNamespace.TryGetValue(barNamespace,out serializer))
{
var ao = new XmlAttributeOverrides();
var a = new XmlAttributes();
a.XmlElements.Add(new XmlElementAttribute { Namespace = barNamespace });
ao.Add(typeof(Foo),a);
serializer = new XmlSerializer(typeof(Foo),ao);
s_serializersByNamespace[barNamespace] = serializer;
}
}
}
return serializer;
}
注意:如果您还想要特定的 xmlns
控件,那就是 XmlSerializerNamespaces
:
var obj = new Foo { Bar = "abc" };
var ns = new XmlSerializerNamespaces();
ns.Add("v1","http://site1");
GetSerializer("http://site1").Serialize(Console.Out,obj,ns);
Console.WriteLine();
ns = new XmlSerializerNamespaces();
ns.Add("v2","http://site2");
GetSerializer("http://site2").Serialize(Console.Out,ns);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。