使用k__backingfield进行JsonMediaTypeFormatter格式化

时间:2016-02-07 21:28:27

标签: c# visual-studio-2015 json.net roslyn activereports

我在JsonMediaTypeFormatter遇到了一个问题,据我所知,这个问题刚刚开始发生。

在某些时候,我拥有的对象(一个普通的旧poco)开始序列化完成作为支持字段。我正在使用自动属性(再次只是一个poco)但无论出于何种原因JsonMediaTypeFormatter的输出是k__backingfield<propname>:"value"

在过去的几周里,我们已经升级到2015年的视觉工作室(虽然我怀疑这是问题的根本原因,因为这已经持续了几周)。

我已经清除了所有形式的nuget缓存,删除了所有bin / obj目录....卸载并重新安装了visual studio 2015专业...修复了visual studio 2015专业....这段代码没有改变一段时间

我们正在使用5.2.0的{​​{1}}版本。

感谢您的帮助。

只是一个快速更新......这不会发生在任何其他人的机器上。我没有遇到任何错误(我注意到)。我还要为此添加一些visual studio 2015相关标签

好的另一个快速更新。我已经发送了一个LinqPad脚本以及将该脚本运行到同事所需的程序集。我发送的程序集是我从nuget中提取并在我的机器上编译的。当他运行代码时,它会根据需要进行序列化。我的机器(现在是另一个同事的机器)仍然遇到了这个问题。

我会继续尽可能地隔离这一点,但我们将非常感谢任何进一步的指导

我可以通过将System.Net.Http.Formatting属性设置为JsonMediaTypeFormatter.UseDataContractJsonSerializer来解决此问题。我正在做更多的研究,为什么这样做有效以及为什么我想要或不想要这样做......我必须在早上与没有这个的同事一起进行更多的测试。问题。我不喜欢代码更改的想法,修复一些行为不可预测的事情。

OK!还有一个更新。到目前为止,受影响的计算机最近安装了Active Reports 10.我们正在执行更多测试,并将在当前不受影响的计算机上安装活动报告10,以确定是否确实是罪魁祸首。为Active Reports添加标记。如果这最终成立,我会向他们打开一个错误。

2 个答案:

答案 0 :(得分:6)

您的POCO是否标有Given(/^Download folder for export is empty$/) do FileUtils.rm_rf('/home/vagrant/Downloads/') end And(/^(\S*) clicks "([^"]*)" button$/) do |user, arg| button = find_button(arg) button.click end And /^The contents of the downloaded csv should be:$/ do |table| for i in 0..5 if(Dir.glob('/home/vagrant/Downloads/*.csv')) break; end sleep(1); // if not found wait one second before continue looping end if(Dir.glob('/home/vagrant/Downloads/*.csv')) Dir['/home/vagrant/Downloads/*'].each do |file_name| arr = CSV.read(file_name, :col_sep => "\t", :row_sep => "\r\n", encoding: "UTF-16:UTF-8") table.raw[0...table.raw.length].each_with_index do |row, row_index| row.each_with_index do |value, index| if arr[row_index][index] == nil arr[row_index][index] = "" end if index == 1 else puts "#{index}" + 'Value in table = ' + "#{value} + 'Value in file' + #{arr[row_index][index]}" value.should eq arr[row_index][index] end end end end else puts "/home/vagrant/Downloads/*.csv file not found!" end end 属性?如果是这样,这可能是问题的原因。

Web API显然附带了一个配置有[Serializable]的Json.Net DefaultContractResolver。此设置的一个影响是,自动属性的名称将以IgnoreSerializableAttribute = false格式序列化,其中<PropertyName>k__BackingField将替换为属性的实际名称。

要解决此问题,您可以从类中删除PropertyName属性,也可以将现成的解析程序替换为具有[Serializable]的新解析程序。要执行后者,请将以下内容添加到IgnoreSerializableAttribute = true中的Application_Start方法:

Global.asax

这是一个演示概念的小提琴(虽然它是一个控制台应用程序,而不是Web API):https://dotnetfiddle.net/Bu6lgy

答案 1 :(得分:1)

确定。安装Active Reports 10会将Newtonsoft.Json添加到GAC。从GAC中删除该程序集已解决了此问题。我将发布活动报告的错误。