关于 c#:JSON.NET 的缓存策略是否会影响我的开发周期?

Is JSON.NET's caching strategy messing with my development cycle?

我正在尝试向我们系统中的现有数据合同添加一个字段。 (EF 代码优先,POCO 的属性为地狱 :P)

但是,当将合约序列化到剃刀视图(以填充到 Angular.js 模型中)时,序列化程序会忽略新字段。如果我在调试模式下单步执行,则视图中的 Model 对象包含该字段,但在我使用 JsonConverter.SerializeObject(Model) 之后,输出模型不包含新字段。

我已经回收了apppool,重新启动了网站并重新启动了IIS,但没有解决。我还使用提琴手检查了数据流,以避免浏览器端出现任何缓存问题。

以下解决方法确实有效,因此模型上确实存在该属性:

1
2
3
4
5
    var model = @Html.ToJson(Model);
    model.NewProperty = @Model.NewProperty;
    return {
        model: model
    };

...其中 Html.ToJson(Model) 是一个扩展方法,它只调用 JsonConvert.SerializeObject(Model) 并将其填充到 MvcHtmlString.

有人知道发生了什么吗?根据这个答案,在 json.net 中有某种形式的类型信息缓存,但很难找到有关它的更多信息。


我正在尝试向我们系统中的现有数据合同添加一个字段。 Json.NET 支持数据契约,数据契约序列化是可选的:

Apply the DataContractAttribute attribute to types (classes, structures, or enumerations) that are used in serialization and deserialization operations by the DataContractSerializer...

You must also apply the DataMemberAttribute to any field, property, or event that holds values you want to serialize. By applying the DataContractAttribute, you explicitly enable the DataContractSerializer to serialize and deserialize the data.

因此,如果您的模型用 [DataContract] 标记,那么您需要用 [DataMember] 标记新成员:

1
2
3
4
5
6
[DataContract]
public class Model : SomeBaseClass
{
    [DataMember]
    public string NewProperty;
}

请注意,即使您的 Model 类没有用 [DataContract] 标记,Json.NET 仍然要求可序列化成员用 [DataMember] 标记,只要 Model 的某些基类用 。有关详细信息,请参阅实现 PropertyChangedBase 时的 caliburn.micro 序列化问题。