前言

本来计划用 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. iOS开发基础100 - MDM证书申请流程

    申请成为MDM Vendor 首先需要拥有一个 iOS Developer Enterprise Program 帐号; 申请成为MDM Vendor,iOS企业开发帐号默认不支持MDM功能,需要向苹 ...

  2. 可视化—gojs 超多超实用经验分享(三)

    目录 32.go.Palette 一排放两个 33.go.Palette 基本用法 34.创建自己指向自己的连线 35.设置不同的 groupTemplate 和 linkTemplate 36.监听 ...

  3. [oeasy]python0066_控制序列_光标位置设置_ESC_逃逸字符_CSI

    光标位置 回忆上次内容 上次讲了 三引号的输出 三引号中 回车和引号 都会 被原样输出 \ 还是需要从 \\转义 黑暗森林 快被摸排清了 还有哪个 转义序列 没 研究过吗? \e是 干什么的? 回忆转 ...

  4. 机器学习:详解迁移学习(Transfer learning)

    详解迁移学习 深度学习中,最强大的理念之一就是,有的时候神经网络可以从一个任务中习得知识,并将这些知识应用到另一个独立的任务中.所以例如,也许已经训练好一个神经网络,能够识别像猫这样的对象,然后使用那 ...

  5. Microsoft Azure AI 机器学习笔记-1

    机器学习基础: 数据与建模: 数据统计和数学建模是处理数据和描述现实情况的关键工具. 观测值是记录的数据实例,而特征是描述观测对象的属性. 标签则代表监督式学习中的已知输出值. 学习类型: 监督式学习 ...

  6. 从DDPM到DDIM(三) DDPM的训练与推理

    从DDPM到DDIM(三) DDPM的训练与推理 前情回顾 首先还是回顾一下之前讨论的成果. 扩散模型的结构和各个概率模型的意义.下图展示了DDPM的双向马尔可夫模型. 其中\(\mathbf{x}_ ...

  7. 【Java】讲讲StreamAPI

    预设场景: 从Mybatis调用Mapper得到的用户集合 List<UserDTO> userList = new ArrayList<>(); 常用的几种API用法示例: ...

  8. 【Hadoop】3.3.1版本部署

    硬件环境: 虚拟机环境配置 硬件:1CPU + [RAM]4G + [DISK]128G 系统:Centos7 x64 这里没有像尚硅谷一样做地址映射解析,直接取IP(我太懒) 192.168.242 ...

  9. 【MySQL】替换件需求

    先上个表结构吧: CREATE TABLE `tm_part_replace` ( `ITEM_ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', ...

  10. 【Git】04 文件删除

    版本分支的概念提示: 工作区就是我们的Git本地仓库,也就是一个很普通的目录 . 通过ADD指令添加文件到暂存区中, 在通过COMMIT指令提交到版本分支, 所谓的版本分支,就是就是这个蓝色的Mast ...