我正在使用 C# 代码尝试将对象序列化为 XML。 我无法向此对象添加 XML 属性或额外属性(例如
bool ShouldSerializeFoo
)。 我也无法向属性添加任何 [Xml*]
属性。我只能控制 XML Serializer。
一些属性是可以为 null 的类型(
int?
等),如果它们为 null,我希望它们不被序列化(即 foo.HasValue
为 false)。
有没有办法指示 C# 中的 XML 序列化程序跳过可为 null 值类型的 null 属性?如果没有,有没有办法为每个属性挂钩
ShouldSerialize()
以便我可以将自定义逻辑注入其中? (我可以手动检查该值是否为可空类型,并进行 HasValue
检查自己)。
给出这个 C# 类:
public class SomeObject
{
public int? Foo { get; set; }
public string? Bar { get; set; }
}
如果我将
Foo
设置为 null
并将 Bar
设置为 "Something"
,我希望 XML 输出为:
<SomeObject>
<Bar>Something</Bar>
</SomeObject>
我当前正在使用类似的东西来调用序列化器:
using System.Xml;
using System.Xml.Serialization;
// Class code omitted
public string CreateXML(SomeObject objToSerialize)
{
using StringWriter stringWriter = new();
using XmlWriter xmlWriter = XmlWriter.Create(stringWriter, new() { OmitXmlDeclaration = true });
xmlWriter.Serialize(xmlWriter, objToSerialize, new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty }));
return stringWriter.ToString();
}
如果我想要的不可能,我将在事后手动编辑序列化的 XML 以删除它们(使用正则表达式查找并用空字符串替换
'nil'
元素),但我宁愿序列化器跳过首先这些价值观。
是的,您可以向
XmlAttributeOverrides
构造函数提供 XmlSerializer
的集合。缺点是您必须递归扫描类型层次结构才能创建此集合,但它确实允许您以与 XML 属性相同的方式控制序列化,而无需修改您希望序列化的类型。