首页 > 解决方案 > JSON.NET 的缓存策略是否会影响我的开发周期?

问题描述

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

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

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

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

    var model = @Html.ToJson(Model);
    model.NewProperty = @Model.NewProperty;
    return {
        model: model
    };

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

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

标签: c#asp.netrazorjson.net

解决方案


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

将 DataContractAttribute 属性应用于 DataContractSerializer 在序列化和反序列化操作中使用的类型(类、结构或枚举)...

您还必须将 DataMemberAttribute 应用于包含要序列化的值的任何字段、属性或事件。通过应用 DataContractAttribute,您可以显式启用 DataContractSerializer 来序列化和反序列化数据。

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

[DataContract]
public class Model : SomeBaseClass
{
    [DataMember]
    public string NewProperty;
}

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


推荐阅读