OData – Custom Serialize & Deserialize
前言
本来计划用 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的更多相关文章
- C#序列化与反序列化(Serialize,Deserialize)实例详解
这篇文章主要介绍了C#序列化与反序列化(Serialize,Deserialize)的方法,实例分析了C#序列化与反序列化的常见技巧,需要的朋友可以参考下 本文实例讲述了C#序列化与反序列化(Seri ...
- 序列化与反序列化Serialize&Deserialize
序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了.比如,一个计数器,数值为2,我们可以用字符串“2”表示.如果有个对象,叫做connter, ...
- XML Serialize/Deserialize
using System; using System.Collections.Generic; using System.Globalization; using System.IO; using S ...
- [LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)
描述 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”. 如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉 ...
- 使用NuGet管理项目类库引用
NuGet 是微软开发平台(包括.NET平台)的一个包管理器,这里只介绍和.NET相关的NuGet Visual Studio扩展客户端, 在VS2010 ,VS2012 ,VS2013中默认集成了N ...
- NuGet管理
使用NuGet管理项目类库引用 NuGet 是微软开发平台(包括.NET平台)的一个包管理器,这里只介绍和.NET相关的NuGet Visual Studio扩展客户端, 在VS2010 ,VS2 ...
- Jackson Annotation Examples
1. Overview In this article, we’ll do a deep dive into Jackson Annotations. We’ll see how to use the ...
- 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 ...
- 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 ...
- Parameter Binding in ASP.NET Web API
https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding ...
随机推荐
- 自动化车间3D可视化设计思路
自动化车间3D可视化设计思路 随着国内制造业企业的高速发展,再加上政策支持,高效的生产模式和先进的管理方式越来越受到企业重视.更多的企业将工业信息化技术进行广泛的应用,比如MES系统.数字孪生以及生产 ...
- Django __init__ 方法用于初始化
使用面向对象的方法来创建一个栈板信息的模型,比如使用 Python 的类来表示栈板信息.以下是一个简单的示例: class Pallet: def __init__(self, number, nam ...
- 欢迎访问pycharm 每次开启时都显示
文件->设置->外观与行为->系统设置->将"启动时重新打开项目"前的勾去掉
- C# DataGridView控件用法大全
动态添加新行 //方法一: int index = this.dataGridView1.Rows.Add(); this.dataGridView1.Rows[index].Cells[0].Val ...
- 【JavaScript高级04】作用域和作用域链
1,作用域 作用域表示的是变量的有效区域,JavaScript中作用域分为全局作用域和函数作用域(在es6之前没有块作用域).其确定时间为编写成功之后就已经确定好了. 作用域的作用是用来隔离变量,不同 ...
- linux部署Python UI自动化项目过程
1.安装chrome浏览器 下载 访问谷歌中文网站:Google Chrome 网络浏览器. 将页面滑到最下面,点击其他平台, 在弹出的页面选择linux 选择对应的系统版本进行下载. 下载后的deb ...
- python中基于tcp协议与udp的通信
python中基于tcp协议与udp的通信(数据传输) 一.TCP协议介绍 流式协议(以数据流的形式通信传输) 安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在 ...
- Jmeter函数助手4-RandomDate
RandomDate函数用于生成一段时间范围内的随机日期(年月日). Format string for DateTimeFormatter (optional) (default yyyy-MM-d ...
- 关于spring boot中mapper注入到service时IDEA报错的解决办法
虽然这个错误不影响正常运行但是作为强迫症患者看着实属难受,经过在论坛查看资料学习到以下两种解决方法,可以供大家参考以下,如有什么错误的地方还希望各位大佬指定一下. 1.在注解@Autowired后增加 ...
- 【Vue】HutoolExcel导出
最近写Excel导出功能,发现需求有点复杂,这里整理一下思路和解决方案 一.需求背景: 老系统改造,功能和代码是现成的,预览了一下内容: 第一个是有特定样式,比如首行标题,以及红色的列名称 第二个,导 ...