c# - 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 中有某种形式的类型信息缓存,但很难找到更多关于它的信息。
解决方案
我正在尝试向我们系统中的现有数据合同添加一个字段。 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 序列化问题。
推荐阅读
- android - 如何测量我的应用程序的电池使用情况?
- json - 在 SQL Server 中加入和处理大型数据集太慢
- html - 停止在字体真棒图标周围环绕文本
- oauth-2.0 - SPA 应用程序中的 OAuth 2 授权代码流与隐式流
- scala - 如何为akka http设置调度程序/线程池
- apache - DirectAdmin 更改 DocumentRoot
- javascript - 在按钮单击时隐藏 div 元素并将其替换为另一个 div 而不使用 jquery
- react-table - 基于过滤数据的 React-Table 中的动态页脚
- javascript - 如何使用多个类来修改单个数据源而不将其声明为全局?
- bash - 用于 wget 以特定字符开头的 url 的 Bash 脚本