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 中有某种形式的类型信息缓存,但很难找到有关它的更多信息。
- 您是否使用 HTTP 请求进行检查?我的猜测是您的浏览器正在缓存响应。
-
页面的其他部分更新正常,模型作为 Razor 渲染周期的一部分插入,甚至在页面发送到浏览器之前。
-
好吧,您的浏览器和 ASP.Net 缓存是我关注的地方,而不是 JSON.Net 的模式缓存。
-
也许你有一些关于从哪里开始的指示。尤其是使用"ASP.Net 缓存"。
-
重新启动您的 ASP.Net 服务器以清除该缓存,然后在您的浏览器中,选中您的开发工具"网络选项卡"中的复选框以禁用客户端缓存。并验证缓存标头在请求和响应中的行为是否符合要求。
-
是的。回收和重新启动是我尝试的第一件事。提琴手告诉我浏览器没有缓存任何东西。为什么您如此确定架构缓存与它无关?
-
我从来没有说过我确定它不是 JSON.Net。我认为这更有可能,而且是更富有成果的调查路线。它们是有区别的。我还是这么想的。我很怀疑这与 JSON.Net 有什么关系。
-
Json.NET 合同缓存不太可能导致问题。合约只是运行时的,并缓存在一个静态变量中,该变量仅在它被实例化的 AppDomain 期间持续存在。您确定用 [DataMember] 标记了您的新成员吗?请记住,数据合约序列化是可选的。
-
好吧,不……我实际上没有。我不知道数据合同是在序列化程序中专门处理的。在所有脚手架完成之前,我不会添加属性,因为我现在不想创建迁移。大概就是这样,但我要到明天才能测试它。如果您将其添加为答案,我会给您。
-
newtonsoft.com/json/help/html/NullValueHandlingIgnore.htm。这个设置正确吗?
-
@ChristianWatteng?rd - 如果添加 [DataMember] 不能解决问题,那么我认为我们需要查看一个最小的可重现示例来帮助您。特别是 Html.ToJson() 的源代码会很有用。此处显示的版本使用 JavaScriptSerializer 而不是 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 序列化问题。