【发布时间】:2021-06-15 15:01:00
【问题描述】:
我想减少序列化输出中的混乱,为经常相同或不使用的属性引入默认值。
但是,它们仍然在输出中。我做错了什么?
这应该是完整的(虽然没有编译):
[Serializable]
public class MyClass
{
[DefaultValue(null)]
public string Alias { get; set; } = null;
[DefaultValue(false)]
public bool Deactivated { get; set; } = false;
[DefaultValue(null)]
public bool? MyNullable { get; set; } = null;
}
public static string SerializeFromObject<T>(this T toSerialize)
{
var xmlSerializer = new XmlSerializer(toSerialize.GetType());
using (StringWriter textWriter = new StringWriter())
{
xmlSerializer.Serialize(textWriter, toSerialize);
return textWriter.ToString();
}
}
var myClass = new MyClass();
var str = SerializeFromObject(myClass);
这里是 xml 输出,仍然包括可为空的:
<?xml version="1.0" encoding="utf-16"?>
<MyClass xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MyNullable xsi:nil="true" />
</MyClass>
如何去掉序列化 xml 中的 nullable?
【问题讨论】:
-
nil 来自 XmlElementAttribute.IsNullable 属性docs.microsoft.com/en-us/dotnet/api/…
-
因此 DefaultValueAttribute 不应更改 XmlElementAttribute.IsNullable 行为。但是 DataContract 作为一个 DataMemberAttribute.EmitDefaultValue 属性,你会有更好的运气。但你可能不喜欢 DataContractSerializer。
-
这是一个简短的副本过去。 dotnetfiddle.net/lzB9QM。你必须有 System.Runtime 参考。DataContract 没有像 Xml 那样的编码头,所以你可能有不匹配。如果您使用的唯一 Xml 属性是 DefaultValue,则为了兼容性,您会没事的。但是对于更复杂的类我说不出来。
-
感觉不像是我的答案。虽然问题很清楚,但我知道它为什么会这样。我也知道 DataContract 不是要走的路。如果你找到一种写出难以理解的答案的方法,你可以接受一切。顺便说一句,刚刚有一个想法。也许您可以使用旧的 Json.net 将 Json 序列化为 Json,然后使用相同的工具将 Json To Xml 序列化。这可能会解决您的问题。
-
看看Xml serialization - Hide null values。对于可空值类型,似乎没有可以抑制其序列化的属性,因此需要conditional serialization patterns 之一。
标签: c# xml xml-serialization default-value xmlserializer