我的一些合约有很多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
答案 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。