【问题标题】:Prevent serializing default value types with ServiceStack Json防止使用 ServiceStack Json 序列化默认值类型
【发布时间】:2015-05-22 00:13:42
【问题描述】:

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

如果这些属性是默认值,我不想序列化它们,因为这最终会占用相当多的带宽,而在我的情况下,这些额外的字节确实会产生影响。由于序列化这些默认值会产生很多不必要的噪音,因此读取日志也需要花费更多的精力。

我知道您可以使用 JsConfig.SerializeFnRawSerializeFn 在这种情况下返回 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

【问题讨论】:

标签: c# servicestack-text


【解决方案1】:

您可以使用可为空的值,例如 int? 在这种情况下,默认情况下不会发出 null 值。

您可以通过使用 [DataMember(EmitDefaultValue = false)] 注释单个属性来抑制默认值,例如:

[DataContract]
public class Poco
{
    [DataMember(EmitDefaultValue = false)]
    public int DontEmitDefaultValue { get; set; }
}

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

JsConfig.ExcludeDefaultValues = true;

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

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

【讨论】:

  • 这么快!非常感谢。
猜你喜欢
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
相关资源
最近更新 更多