避免在域模型中使用JsonIgnore属性

我有一个包含多个实体类的域模型组件。 在另一个组件中,我使用Json.NET序列化实现了实体存储库。 我希望在序列化期间忽略一些实体属性,因此直接的解决方案是使用JsonIgnore属性修饰这些属性。 但是,在原则上,我想避免在我的域模型中引用其他组件 – 包括第三方库,如Json.NET。

我知道我可以创建一个自定义合同解析器,如此处所述,但很难概括在各种实体中序列化和不序列化的内容。 通常我想忽略所有只读属性,但是例如集合有例外:

 public List Pixels { get { return this.Pixels; } } 

我也可以为这里描述的每个实体创建一个专用的合同解析器,但对我来说这似乎是一个高维护的解决方案 – 特别是对于众多实体。

理想的解决方案是,如果Json.NET支持.NET框架中的某些属性,但我甚至找不到合适的候选者……

我考虑在我的域模型中创建自己的自定义Ignore属性,并制作一个自定义契约解析器,它使用reflection来检测此属性,并在序列化时忽略修饰的属性。 但这真的是给定问题的最佳解决方案吗?

我相信默认情况下Json.net尊重 DataContractAttribute 。 虽然你必须包容而不是独占,但这也意味着序列化可以改为Microsofts Binary(或者xml),而不必重新设计你的域模型。

如果一个类有许多属性而你只想序列化它们的一小部分,那么将JsonIgnore添加到所有其他属性将是乏味且容易出错的。 解决此方案的方法是将DataContractAttribute添加到类,将DataMemberAttributes添加到要序列化的属性。 这是选择性序列化,与使用JsonIgnoreAttribute的选择退出序列化相比,只有您标记的属性被序列化。

 [DataContract] public class Computer { // included in JSON [DataMember] public string Name { get; set; } [DataMember] public decimal SalePrice { get; set; } // ignored public string Manufacture { get; set; } public int StockCount { get; set; } public decimal WholeSalePrice { get; set; } public DateTime NextShipmentDate { get; set; } } 

您可以考虑使用视图模型之类的东西来控制实体模型的哪些属性被序列化。 我自己没有使用它,但是考虑将它用于我的项目,但AutoMapper可能需要考虑将实体模型与序列化模型分离。

Json序列化器还支持选择性序列化

 [JsonObject(MemberSerialization.OptIn)] public class File { // excluded from serialization // does not have JsonPropertyAttribute public Guid Id { get; set; } [JsonProperty] public string Name { get; set; } [JsonProperty] public int Size { get; set; } }