C# XML 序列化:序列化可空值类型(想要在没有装饰器/属性/ShouldSerialize 的情况下抑制“空”值)

问题描述 投票:0回答:1

我正在使用 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'
元素),但我宁愿序列化器跳过首先这些价值观。

c# .net xml xml-serialization
1个回答
0
投票

是的,您可以向

XmlAttributeOverrides
构造函数提供
XmlSerializer
的集合。缺点是您必须递归扫描类型层次结构才能创建此集合,但它确实允许您以与 XML 属性相同的方式控制序列化,而无需修改您希望序列化的类型。

© www.soinside.com 2019 - 2024. All rights reserved.