我在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添加标记。如果这最终成立,我会向他们打开一个错误。
答案 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中删除该程序集已解决了此问题。我将发布活动报告的错误。