草庐IT

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

codeneng 2023-03-28 原文

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 序列化问题。

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

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  3. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  4. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  5. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  6. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  7. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  8. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  9. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  10. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

随机推荐