使用k__backingfield进行JsonMediaTypeFormatter格式化

mis*_*ger 5 c# activereports json.net roslyn visual-studio-2015

我有一个问题,JsonMediaTypeFormatter据我所知,刚刚开始发生的事情.

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

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

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

我们使用的版本5.2.0System.Net.Http.Formatting.

感谢您的任何帮助.

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

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

我将继续尽可能地隔离这一点,但任何进一步的指导将不胜感激

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

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

Bri*_*ers 6

您的POCO是否标有[Serializable]属性?如果是这样,这可能是问题的原因.

Web API显然附带了一个DefaultContractResolver配置的Json.Net IgnoreSerializableAttribute = false.其中一个此设置的效果是,汽车属性的名称将在格式序列<PropertyName>k__BackingField,其中PropertyName替换属性的实际名称.

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

var resolver = new Newtonsoft.Json.Serialization.DefaultContractResolver();
resolver.IgnoreSerializableAttribute = true;
var config = GlobalConfiguration.Configuration;    
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = resolver;
Run Code Online (Sandbox Code Playgroud)

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


mis*_*ger 1

好的。安装 Active Reports 10 添加Newtonsoft.Json到 GAC。从 GAC 中删除该程序集就解决了这个问题。我将通过活动报告发布错误。