加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-web-api – Asp.net web api中的DbGeometry序列化问题

发布时间:2020-12-16 07:41:25 所属栏目:asp.Net 来源:网络整理
导读:我正在使用Entity Framework 6.0 Code First构建OData v3 Web API. 一切运作良好,我可以执行CRUD操作回到api服务器. 但是我使用的是空间类型,我的一些实体具有DbGeometry属性.当我尝试从客户端应用程序(仅用于测试的控制台应用程序)更新/发布具有DbGeometry
我正在使用Entity Framework 6.0 Code First构建OData v3 Web API.

一切运作良好,我可以执行CRUD操作回到api服务器.

但是我使用的是空间类型,我的一些实体具有DbGeometry属性.当我尝试从客户端应用程序(仅用于测试的控制台应用程序)更新/发布具有DbGeometry类型的实体时,我得到此DataServiceRequestException:

No parameterless constructor defined for this object.

我花了一段时间,但我确定DbGeometry类型是负责任的.我已经查看了this topic here并制作了一个自定义的JsonConverter,我应用于该属性:

[Required]
[JsonConverter(typeof(DbGeometryConverter))]
[Column("geometria")]
public DbGeometry Geometria { get; set; }

那没用.除非我删除DbGeometry属性,否则不会在web api服务器上反序列化该对象.

我还尝试更改全局json序列化程序行为

var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
jsonFormatter.SerializerSettings.Converters.Add(new DbGeometryConverter());

也是徒劳的.我真的需要DbGeometry属性.我还能做些什么来解决这个问题?

解决方法

有点晚了,但对于那些寻求答案的人:

我已经设法在控制器级别使用完全相同的代码.这个想法取自SO Question&Answer.

所以,这里的代码包括DbGeometryConverter.

DbGeometryConverter.cs:

public class DbGeometryConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType.IsAssignableFrom(typeof(DbGeometry));
    }
    public override object ReadJson(JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer)
    {
        var location = JObject.Load(reader);
        var token = location["Geometry"]["WellKnownText"];
        string geom = token.ToString();

        token = location["Geometry"]["CoordinateSystemId"];
        int srid = token != null ? int.Parse(token.ToString()) : 0;
        var converted = DbGeometry.FromText(geom,srid);
        return converted;
    }
    public override void WriteJson(JsonWriter writer,object value,JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanWrite => false;
}

CustomJsonAttribute.cs:

public class CustomJsonAttribute : Attribute,IControllerConfiguration
{
    public void Initialize(HttpControllerSettings controllerSettings,HttpControllerDescriptor controllerDescriptor)
    {
        var formatter = controllerSettings.Formatters.JsonFormatter;
        formatter.SerializerSettings.Converters.Add(new DbGeometryConverter());
    }
}

和[CustomJson]属性在使用DbGeometry的控制器上.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读