防止使用 ServiceStack 序列化默认值类型 Json
Prevent serializing default value types with ServiceStack Json
我的一些合同有很多 int/decimal/short/byte 等属性,这些属性通常有默认值。
如果这些属性是默认值,我不想序列化它们,因为这最终会占用相当多的带宽,而在我的情况下,这些额外的字节确实有所作为。它还使阅读日志更加费力,因为将这些默认值序列化会产生很多不必要的噪音。
我知道您可以在这种情况下使用 JsConfig.SerializeFn 和 RawSerializeFn 到 return null但这也会影响列表,这是不可取的。
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
您可以使用可为 null 的值,例如 int?
,在这种情况下,默认情况下不会发出 null
值。
您可以通过使用 [DataMember(EmitDefaultValue = false)]
注释单个属性来抑制默认值,例如:
[DataContract]
public class Poco
{
[DataMember(EmitDefaultValue = false)]
public int DontEmitDefaultValue { get; set; }
}
最后,我刚刚添加了对全局排除默认值的支持:
JsConfig.ExcludeDefaultValues = true;
Where 禁止序列化值类型的默认值。
此功能可从 v4.0.41+ 开始使用,现在 available on MyGet.
我的一些合同有很多 int/decimal/short/byte 等属性,这些属性通常有默认值。
如果这些属性是默认值,我不想序列化它们,因为这最终会占用相当多的带宽,而在我的情况下,这些额外的字节确实有所作为。它还使阅读日志更加费力,因为将这些默认值序列化会产生很多不必要的噪音。
我知道您可以在这种情况下使用 JsConfig.SerializeFn 和 RawSerializeFn 到 return null但这也会影响列表,这是不可取的。
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
您可以使用可为 null 的值,例如 int?
,在这种情况下,默认情况下不会发出 null
值。
您可以通过使用 [DataMember(EmitDefaultValue = false)]
注释单个属性来抑制默认值,例如:
[DataContract]
public class Poco
{
[DataMember(EmitDefaultValue = false)]
public int DontEmitDefaultValue { get; set; }
}
最后,我刚刚添加了对全局排除默认值的支持:
JsConfig.ExcludeDefaultValues = true;
Where 禁止序列化值类型的默认值。
此功能可从 v4.0.41+ 开始使用,现在 available on MyGet.