除了默认的JSON和XML序列化器外,如果想使用其它格式的(比如二进制)序列化器,也是可以的。比如著名的Protobuf和Msgpack,它们都是二进制的序列化器,特点是速度快,体积小。使用方法如下。

1.定义MediaTypeFormatter,这里以定义MsgPack的formatter为例,主要代码如下。

2.WebApiConfig中注册,代码如下。

3.客户端调用(请求头中指定Accept),在.net端调用使用HttpClient,代码如下图。

附:MessagePackMediaTypeFormatter源代码。

using MsgPack;
using MsgPack.Serialization;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Formatting;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Web;namespace HWA.OData.Site.Formatter
{/// <summary>/// MsgPack序列化器formatter/// </summary>public class MessagePackMediaTypeFormatter : MediaTypeFormatter{private readonly string _mime = "application/x-msgpack";Func<Type, bool> IsAllowedType = (t) =>{if (!t.IsAbstract && !t.IsInterface && t != null && !t.IsNotPublic)return true;if (typeof(IEnumerable).IsAssignableFrom(t))return true;return false;};public MessagePackMediaTypeFormatter(){SupportedMediaTypes.Add(new MediaTypeHeaderValue(_mime));}public override bool CanWriteType(Type type){if (type == null)throw new ArgumentNullException("Type is null");return IsAllowedType(type);}public override Task WriteToStreamAsync(Type type, object value, System.IO.Stream stream, HttpContent content, TransportContext transportContext){if (type == null)throw new ArgumentNullException("type is null");if (stream == null)throw new ArgumentNullException("Write stream is null");var tcs = new TaskCompletionSource<object>();if (type != typeof(string) && typeof(IEnumerable).IsAssignableFrom(type)){value = (value as IEnumerable<object>).ToList();}var serializer = MessagePackSerializer.Create<dynamic>();serializer.Pack(stream, value);tcs.SetResult(null);return tcs.Task;}public override Task<object> ReadFromStreamAsync(Type type, Stream stream, HttpContent content, IFormatterLogger formatterLogger){var tcs = new TaskCompletionSource<object>();if (content.Headers != null && content.Headers.ContentLength == 0)return null;try{var serializer = MessagePackSerializer.Create(type);object result;using (var mpUnpacker = Unpacker.Create(stream)){mpUnpacker.Read();result = serializer.UnpackFrom(mpUnpacker);}tcs.SetResult(result);}catch (Exception e){if (formatterLogger == null) throw;formatterLogger.LogError(String.Empty, e.Message);tcs.SetResult(GetDefaultValueForType(type));}return tcs.Task;}public override bool CanReadType(Type type){if (type == null)throw new ArgumentNullException("type is null");return IsAllowedType(type);}}
}

转载于:https://www.cnblogs.com/mcgrady/p/4701954.html

重点关注之自定义序列化方式(Protobuf和Msgpack)相关推荐

  1. 高效的序列化/反序列化数据方式 Protobuf

    高效的序列化/反序列化数据方式 Protobuf github地址 目录 protocolBuffers 序列化 Int32 String Map slice 序列化小结 protocolBuffer ...

  2. 使用Kryo的序列化方式提升Netty性能

    2019独角兽企业重金招聘Python工程师标准>>> 为什么选择Kryo? 首先,Kryo的序列化方式,在性能方面是比较好的,和Protobuf差不多,比Java原生的序列化方式快 ...

  3. Java序列化 - 分析不同序列化方式的优劣

    1.序列化简介 1.1 定义 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据 1.2 序列化的目的 通过序列 ...

  4. alin的学习之路:序列化与protobuf

    alin的学习之路:序列化与protobuf 1. 序列化(串行化) 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程,与之相对应的过程称之为反序列化(Unser ...

  5. 序列化:ProtoBuf与JSON的比较

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:https://my.oschina.net/xiaolei ...

  6. 【Android Protobuf 序列化】Protobuf 简介 ( Protobuf 项目简介 | Protobuf 优缺点分析 )

    文章目录 一.Protobuf 简介 二.Protobuf 优缺点分析 1.Protobuf 优点 2.Protobuf 缺点 三.参考资料 一.Protobuf 简介 Protobuf 是 Goog ...

  7. Redis序列化、RedisTemplate序列化方式大解读,介绍Genericjackson2jsonredisserializer序列化器的坑

    前言 上一篇已经介绍了优雅的操作Redis: [小家Spring]Spring Boot中使用RedisTemplate优雅的操作Redis,并且解决RedisTemplate泛型注入的问题.本篇着重 ...

  8. spring序列化_使用@JsonIdentityInfo的Spring自定义序列化器

    spring序列化 介绍 Spring中从JSON到JSON的序列化/反序列化已广泛用于基于Spring的现代应用程序中. 它基于杰克逊. Jackson可以轻松地将任何POJO序列化为JSON,反之 ...

  9. 使用@JsonIdentityInfo的Spring自定义序列化器

    介绍 Spring中从JSON到JSON的序列化/反序列化已广泛用于基于Spring的现代应用程序中. 它基于杰克逊. Jackson可以轻松地将任何POJO序列化为JSON,反之亦然. 这段代码写得 ...

  10. 高效的数据压缩编码方式 Protobuf

    高效的数据压缩编码方式 Protobuf github地址 目录 ProtocolBuffers 是什么 为什么要发明 ProtocolBuffers proto3 定义 Message 分配字段编号 ...

最新文章

  1. redis缓存和cookie实现Session共享
  2. 自定义控件 DotNetBar
  3. Elasticsearch java api 基本搜索部分详解
  4. [python opencv 计算机视觉零基础到实战] 十三 直方图颜色提鲜
  5. RDB和AOF速度测试
  6. leetcode 645. 错误的集合
  7. WordPress Plupload插件未明跨站脚本漏洞
  8. java基础 泛型类的定义
  9. 合伙人的重要性超过了商业模式和行业选择(转)
  10. Python 命令行库的大乱斗 | 凌云时刻
  11. javaweb开发后端常用技术_java后端开发需要掌握什么技术
  12. 循序渐进!疯狂java讲义第五版pdf蓝奏云下载
  13. 中国图形图象学报和计算机科学,《中国图象图形学报》编辑部
  14. python和excel进行数据交换_python-doc/使用Python和Excel进行交互式数据分析.md at master · HSUCHING/python-doc · GitHub...
  15. 爱荷华州立 计算机博士,美国爱荷华州立大学无损检测中心裴宁博士来我院讲学...
  16. 掌阅 兼容性测试 结果
  17. 1.6.4- 四大名著案例
  18. 【3D建模】Solidworks 3D建模及PrusaSlicer切片打印学习笔记
  19. 服务器CPU占用过高处理方案
  20. Python地理可视化:plotly绘制mapbox地图热力密度图

热门文章

  1. Android Studio1.4.x JNI开发基础-基本环境配置
  2. sed截取连接数升高时的慢日志
  3. 买入股票后必须遵守的八项原则
  4. Hibernate 可编程的配置方式
  5. 学习笔记_2011-10-02
  6. 网络战争阴影临近,伊朗核设施受攻击
  7. 读后感——《构建之法》第1.2.3章
  8. Android设计模式--之命令模式
  9. 【leetcode】二进制手表-经典或回溯题目
  10. java day34【ECMAScript 、BOM 、DOM 、事件】