DbGeography反序列化及Newtonsoft.Json版本冲突问题求助
问题分析与解决方案
你现在遇到了两个独立的问题:第一个是DbGeography类型的JSON序列化/反序列化逻辑问题,第二个是Newtonsoft.Json的程序集版本冲突问题。我们先解决最紧急的版本绑定错误,再修正转换器的逻辑缺陷。
1. Newtonsoft.Json版本不匹配错误(FileLoadException)
这个错误的核心原因是:你的服务端项目引用的Newtonsoft.Json版本,和ASP.NET Web API序列化响应时依赖的版本(错误日志里的10.0.0.0)不一致,导致.NET运行时无法正确绑定程序集。
解决方案:
- 检查当前引用版本:右键服务端项目 → 管理NuGet程序包,查看Newtonsoft.Json的实际安装版本。
- 添加程序集绑定重定向:在服务端项目的
Web.config的<configuration>节点下加入以下配置,强制运行时将所有旧版本的Newtonsoft.Json重定向到你实际使用的版本:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <!-- 把oldVersion范围覆盖到你需要的版本,newVersion改成实际安装的版本号 --> <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.1.0" /> </dependentAssembly> </assemblyBinding> </runtime>
- 更新Web API依赖包:如果你的Web API项目使用的是旧版
Microsoft.AspNet.WebApi.Client,它可能绑定了特定版本的Json.NET。可以尝试更新这个NuGet包到最新稳定版,让它自动适配兼容的Json.NET版本。
2. DbGeography自定义转换器的逻辑问题
你写的DbGeographyConverter存在几个关键缺陷,即使解决了版本问题,序列化/反序列化仍会出错:
核心问题点:
CanConvert方法逻辑错误:你当前判断的是objectType是否可分配给string,但我们需要转换的是DbGeography类型,应该修改为:
public override bool CanConvert(Type objectType) { return objectType == typeof(System.Data.Entity.Spatial.DbGeography); }
- 反序列化逻辑依赖固定JSON结构:你假设返回的JSON是
{"Geography":{"WellKnownText":"..."}},但实际服务端返回的结构可能不同,需要根据真实的JSON格式调整解析逻辑。 - 序列化方法未解决原问题:
WriteJson直接调用默认序列化,还是会触发最初的WellKnownValue访问错误,需要自定义输出逻辑,比如直接序列化WellKnownText:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var geography = value as System.Data.Entity.Spatial.DbGeography; if (geography != null) { // 直接输出WellKnownText字符串,避免序列化DbGeography内部属性 serializer.Serialize(writer, geography.WellKnownValue.WellKnownText); } else { serializer.Serialize(writer, value); } }
正确使用转换器:
- 客户端反序列化时,需显式指定转换器:
IEnumerable<Event> events = JsonConvert.DeserializeObject<List<Event>>(content, new DbGeographyConverter());
- 服务端序列化时,要在Web API配置中注册转换器:
// 在WebApiConfig.cs的Register方法中添加 config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new DbGeographyConverter());
总结
- 优先解决Newtonsoft.Json的版本冲突问题,这是当前抛出错误的直接原因。
- 修正自定义转换器的逻辑,确保它能正确处理
DbGeography的序列化和反序列化流程。 - 在客户端和服务端分别正确注册使用转换器,完成整个序列化链路的适配。
内容的提问来源于stack exchange,提问作者kostik
相关产品推荐
相关产品推荐

