前言

本来计划用 Custom Serialize 来解决 OData 不支持 [JsonPropertyName] 的问题.

但是后来发现 Custom Serialize 并不能解决这个问题. Custom Serialize 允许我们在 response 的时候修改输出的 JSON

但是 $filter=name eq 'test', 在 parse odata query 的时候, JsonPropertyName 也是需要考虑到的.

而这个领域是无法通过 Custom Serialize & Deserialize 解决的, 所以我走错路了.

但还是小小记入一下它吧.

参考:

Build formatter extensions in ASP.NET Core OData 8 and hooks in ODataConnectedService

Custom Serialize

做一个类并继承 ODataResourceSerializer

public class MyResourceSerializer : ODataResourceSerializer
{
public MyResourceSerializer(IODataSerializerProvider serializerProvider)
: base(serializerProvider)
{ } public override ODataResource CreateResource(SelectExpandNode selectExpandNode, ResourceContext resourceContext)
{
ODataResource resource = base.CreateResource(selectExpandNode, resourceContext);
resource.Properties.ToList().ForEach(p => p.Name = p.Name.ToUpper());
return resource;
}
}

Override 它的方法, 上面是一个把 property name to uppercase 的例子

接着还需要一个 SerializerProvider 来把上面的 MyResourceSerializer 提供出去

public class MySerializerProvider : ODataSerializerProvider
{
public MySerializerProvider(IServiceProvider serviceProvider)
: base(serviceProvider)
{ } public override IODataEdmTypeSerializer GetEdmTypeSerializer(IEdmTypeReference edmType)
{
if (edmType.IsEntity() || edmType.IsComplex())
{
return new MyResourceSerializer(this);
}
return base.GetEdmTypeSerializer(edmType);
}
}

ODataSerializerProvider 内有对应不同类型的 serializer, 比如 Enum

依据需求替换掉对应的 Serializer.

最后是把这个 provider register to services provider.

Custom Deserialize

和 Serialize 一样, 做一个 deserialize class, 一个 provider, 让后 register to services provider.

public class MyResourceDeserializer : ODataResourceDeserializer
{
public MyResourceDeserializer(IODataDeserializerProvider serializerProvider)
: base(serializerProvider)
{ } public override object ReadResource(ODataResourceWrapper resourceWrapper, IEdmStructuredTypeReference structuredType, ODataDeserializerContext readContext)
{
object resource = base.ReadResource(resourceWrapper, structuredType, readContext);
return resource;
}
} public class MyDeserializerProvider : ODataDeserializerProvider
{
public MyDeserializerProvider(IServiceProvider serviceProvider)
: base(serviceProvider)
{ } public override IODataEdmTypeDeserializer GetEdmTypeDeserializer(IEdmTypeReference edmType, bool isDelta = false)
{
if (edmType.IsEntity() || edmType.IsComplex())
{
return new MyResourceDeserializer(this);
} return base.GetEdmTypeDeserializer(edmType, isDelta);
}
}

题外话

[JsonPropertyName] 怎么弄?

Custom Serialize 无法解决 JsonPropertyName 的问题. 要解决它需要从 ODataConventionModelBuilder 入手.

要嘛改它内部实现, 要嘛直接改它做出来的 EdmModel. 我目前是暂时不去解决这个问题, 毕竟还没有需求.

OData – Custom Serialize & Deserialize的更多相关文章

  1. C#序列化与反序列化(Serialize,Deserialize)实例详解

    这篇文章主要介绍了C#序列化与反序列化(Serialize,Deserialize)的方法,实例分析了C#序列化与反序列化的常见技巧,需要的朋友可以参考下 本文实例讲述了C#序列化与反序列化(Seri ...

  2. 序列化与反序列化Serialize&Deserialize

    序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了.比如,一个计数器,数值为2,我们可以用字符串“2”表示.如果有个对象,叫做connter, ...

  3. XML Serialize/Deserialize

    using System; using System.Collections.Generic; using System.Globalization; using System.IO; using S ...

  4. [LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)

    描述 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”. 如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉 ...

  5. 使用NuGet管理项目类库引用

    NuGet 是微软开发平台(包括.NET平台)的一个包管理器,这里只介绍和.NET相关的NuGet Visual Studio扩展客户端, 在VS2010 ,VS2012 ,VS2013中默认集成了N ...

  6. NuGet管理

    使用NuGet管理项目类库引用   NuGet 是微软开发平台(包括.NET平台)的一个包管理器,这里只介绍和.NET相关的NuGet Visual Studio扩展客户端, 在VS2010 ,VS2 ...

  7. Jackson Annotation Examples

    1. Overview In this article, we’ll do a deep dive into Jackson Annotations. We’ll see how to use the ...

  8. A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets(中英双语)

    文章标题 A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets 且谈Apache Spark的API三剑客:RDD.Dat ...

  9. Along with all the above benefits, you cannot overlook the space efficiency and performance gains in using DataFrames and Dataset APIs for two reasons.

    Of all the developers’ delight, a set of APIs that makes them productive, that are easy to use, and ...

  10. Parameter Binding in ASP.NET Web API

    https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding ...

随机推荐

  1. 前端太卷了,不玩了,写写node.js全栈涨工资,赶紧学起来吧!!!!!

    首先聊下node.js的优缺点和应用场景 Node.js的优点和应用场景 Node.js作为后端开发的选择具有许多优点,以下是其中一些: 高性能: Node.js采用了事件驱动.非阻塞I/O模型,使得 ...

  2. scratch编程作品-龙年发大财

    作品介绍: 龙年欢歌而来,带着满满的希望与勃勃生机.愿小虎鲸Scratch资源站激发您编程之路的无限灵感,让每一天都充满探索与创造的喜悦.在这吉祥如意的年份里,愿您的每一份耕耘都换来丰收的喜悦,每一个 ...

  3. 自写Json转换工具

    前面写了简单的API测试工具ApiTools,返回的json有时需要做很多转换,于是开发了这个工具. 功能包括 1.json字符串转为表格,可以直观的展示,也可以复制,并支持转换后的表格点击列头进行排 ...

  4. 树莓派3b+使用官方屏幕后倒置问题——屏幕倒置

    树莓派3b+的屏幕本身就是倒置的,因此为了使树莓派在官方屏幕下能显示正常的屏幕画面因此需要通过设置把树莓派的官方屏幕的输出倒置一下,这样树莓派的官方屏幕的输出就是正常的了. 解决方法:(源自:http ...

  5. Jax框架在不同版本间的随机数生成并不一致 —— jax.random

    官方: https://jax.readthedocs.io/en/latest/api_compatibility.html#numerics-and-randomness 具体的解释就是在不同的J ...

  6. 工作站CPU超频,通过测试软件的压力测试就OK了吗?终极测试还是要看具体的应用场景

    最近想起超频试试自己年初入手的工作站,也是纯玩,超超频,看看是什么个体验,不过这个过程中还真有所学习. 由于电脑的主板,电源,散热等配的都比较高端,所以上来直接超频5.2G,电压选择为自动,不过再整个 ...

  7. python3.6—opencv-python报错:Exception: Not found: 'python/cv2/py.typed'

    报错: self).run_setup(setup_script=setup_script) File "/tmp/pip-build-env-zsqslesq/overlay/lib/py ...

  8. quartz监控日志(二)添加监听器

    上一章介绍监控job有三种方案,其实还有一个简单方案是实现quartz的TriggerListener. 上次我也试了这个方案,但是由于操作错误,导致没有监控成功,所以才选择分析源码来实现代理进行监控 ...

  9. java_父类子类

    private 只有自身能访问自身 自身 同包子 不同包子类 同包类 其他类 可以访问 不能继承 不能继承 不能访问 不能访问 package/friendly/default == 不写 自身 同包 ...

  10. TwinCAT3 - 实现CiA402

    目录 1,起缘 2,想办法 3,开搞 3.1,CANOpen通信 3.1.1 对象字典 3.1.2 通信建立 3.2,CiA402伺服状态机 3.3,伺服运行 3.3.1 操作模式 3.3.2 轮廓位 ...