使用ServiceStack Json阻止序列化默认值类型

时间:2015-05-22 00:13:42

标签: c# servicestack-text

我的一些合约有很多int / decimal / short / byte等属性,这些属性通常都有默认值。

如果它们是默认值,我不想序列化这些属性,因为它最终占用了相当多的带宽,在我的情况下,这些额外的字节确实有所作为。它还使得阅读日志需要更多的努力,因为序列化这些默认值会产生许多不必要的噪音。

我知道你可以使用 JsConfig.SerializeFn RawSerializeFn 在这种情况下返回null,但这也会影响List,这是不可取的。

JsConfig<int>.SerializeFn = value => value == 0 ? null : value.ToString();

是否有其他方法可以阻止这些值被序列化?

我能想到的一个替代方案是让它们成为可空类型(例如int?)并将它们的值设置为null而不是0以防止序列化,但这将涉及更改大量的合同......

另一个选择是放弃ServiceStack进行json序列化,并使用支持开箱即用的Json.NET:http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_DefaultValueHandling.htm

1 个答案:

答案 0 :(得分:1)

您可以使用可以为空的值,例如null,在这种情况下,默认情况下不会发出[DataMember(EmitDefaultValue = false)]个值。

您可以通过使用[DataContract] public class Poco { [DataMember(EmitDefaultValue = false)] public int DontEmitDefaultValue { get; set; } } 注释单个属性来抑制默认值,例如:

JsConfig.ExcludeDefaultValues = true;

最后,我刚刚添加了对全局排除默认值的支持:

shell=True

禁止序列化值类型的默认值。

此功能可从 v4.0.41 + 获得,现在为available on MyGet