(六)分布式通信----MessagePack序列化
==>>点击查看本系列文章目录
1. .Net Core的序列化方式
1.1 json.Net
常用的工具包,如Newtonsoft.Json, 它是基于json格式的序列化和反序列化的组件
json.net 有以下优点:
侵入性:可以不添加attribute,就能进行序列化操作
灵活性:可以灵活性配置,比如允许被序列化的成员自定义名字,屏蔽的非序列化属性成员
可读性: 数据格式比较简单, 易于读写
依赖性:可以序列化成JObject,无需依赖对象进行序列化和泛型化。
1.2 protobuf
它是基于二进制格式的序列化和反序列化的组件
protobuf 有以下优点:
性能高 : 序列化后体积相比Json和XML很小,适合RPC二进制传输
跨语言:支持跨平台多语言
兼容性:消息格式升级和兼容性还不错
速度快 :序列化反序列化速度很快,快于Json的处理速度
1.3 messagepack
它是基于二进制格式的序列化和反序列化的组件
messagepack有以下优点:
性能高:序列化后体积相比Json和XML很小,适合RPC二进制传输
跨语言:支持跨平台多语言
兼容性:消息格式升级和兼容性还不错
速度快 :序列化反序列化速度很快,快于Json的处理速度
messagepack不管是小数据量还是大数据量都保持比较稳定的性能,本文中使用messagepack序列化方式。
2. 项目编码及设计模式
如下是文件结构:

2.1 工厂模式
抽象接口 工厂负责创建编码器和解码器
1.工厂
/// <summary>
/// 一个抽象的传输消息编解码器工厂。
/// </summary>
public interface ITransportMessageCodecFactory
{
/// <summary>
/// 获取编码器。
/// </summary>
/// <returns>编码器实例。</returns>
ITransportMessageEncoder GetEncoder(); /// <summary>
/// 获取解码器。
/// </summary>
/// <returns>解码器实例。</returns>
ITransportMessageDecoder GetDecoder();
}
2.编码器
/// <summary>
/// 编码器
/// </summary>
public interface ITransportMessageEncoder
{
byte[] Encode(TransportMessage message);
}
3.解码器
/// <summary>
/// 解码器
/// </summary>
public interface ITransportMessageDecoder
{
TransportMessage Decode(byte[] data);
}
实现类 工厂、编码器、解码器为MessagePack的实现
1.工厂
public sealed class MessagePackTransportMessageCodecFactory : ITransportMessageCodecFactory
{
#region Field
private readonly ITransportMessageEncoder _transportMessageEncoder = new MessagePackTransportMessageEncoder();
private readonly ITransportMessageDecoder _transportMessageDecoder = new MessagePackTransportMessageDecoder();
#endregion Field #region Implementation of ITransportMessageCodecFactory /// <inheritdoc />
/// <summary>
/// 获取编码器
/// </summary>
/// <returns></returns>
public ITransportMessageEncoder GetEncoder()
{
return _transportMessageEncoder;
} /// <inheritdoc />
/// <summary>
/// 获取解码器
/// </summary>
/// <returns></returns>
public ITransportMessageDecoder GetDecoder()
{
return _transportMessageDecoder;
}
#endregion Implementation of ITransportMessageCodecFactory
}
2.编码器
public sealed class MessagePackTransportMessageEncoder : ITransportMessageEncoder
{
#region Implementation of ITransportMessageEncoder public byte[] Encode(TransportMessage transportMessage)
{
MessagePackTransportMessage messagePackTransportMessage = new MessagePackTransportMessage(transportMessage);
return MessagePackSerializer.Serialize(messagePackTransportMessage);
} #endregion Implementation of ITransportMessageEncoder
}
3.解码器
public sealed class MessagePackTransportMessageDecoder : ITransportMessageDecoder
{
#region Implementation of ITransportMessageDecoder public TransportMessage Decode(byte[] data)
{
MessagePackTransportMessage messagePackTransportMessage = MessagePackSerializer.Deserialize<MessagePackTransportMessage>(data);
return messagePackTransportMessage.GetTransportMessage();
} #endregion Implementation of ITransportMessageDecoder
}
2.2 装饰器模式
高层的消息模型:
public class TransportMessage
{
/// <summary>
/// 消息Id。
/// </summary>
public string Id { get; set; } /// <summary>
/// 消息内容。
/// </summary>
public object Content { get; set; } /// <summary>
/// 内容类型。
/// </summary>
public string ContentType { get; set; }
}
由于MessagePack序列化方式具有侵入性,需要添加 MessagePackObjectAttribute 和 KeyAttribute 特性,因此需要对 TransportMessage 做装饰:
using MessagePack;
[MessagePackObject]
public class MessagePackTransportMessage
{
private TransportMessage _transportMessage;
public MessagePackTransportMessage(): this(new TransportMessage())
{
}
public MessagePackTransportMessage(TransportMessage transportMessage)
{
this._transportMessage = transportMessage;
}
public TransportMessage GetTransportMessage()
{
return _transportMessage;
}
/// <summary>
/// 消息Id。
/// </summary>
[Key()]
public string Id
{
get { return _transportMessage.Id; }
set { _transportMessage.Id = value; }
}
/// <summary>
/// 消息内容。
/// </summary>
[Key()]
public object Content
{
get { return _transportMessage.Content; }
set { _transportMessage.Content = value; }
}
/// <summary>
/// 内容类型。
/// </summary>
[Key()]
public string ContentType
{
get { return _transportMessage.ContentType; }
set { _transportMessage.ContentType = value; }
}
}
2.3 依赖注入
Autofac 是一个依赖注入工具包,比.net Core 原始的依赖注入拥有更完善的功能,中文官方文档:https://autofaccn.readthedocs.io/zh/latest/index.html
using Autofac;
public static class ContainerBuilderExtensions
{
/// <summary>
/// 使用messagepack编码解码方式
/// </summary>
/// <param name="builder"></param>
/// <returns></returns>
public static ContainerBuilder UseMessagePackCodec(this ContainerBuilder builder)
{
builder.RegisterType(typeof(MessagePackTransportMessageCodecFactory)).As(typeof(ITransportMessageCodecFactory)).SingleInstance();
return builder;
}
}
2.4 单元测试
端到端的测试,同时测试编码和解码
using MessagePack;
using Microsoft.VisualStudio.TestTools.UnitTesting; [TestClass]
public class MessagePackTest
{
[TestMethod]
public void TestCodec()
{
Person person = new Person
{
Name = "张宏伟",
Age =
};
TransportMessage transportMessage = new TransportMessage
{
Id = "",
ContentType = "Person",
Content = person
};
MessagePackTransportMessageCodecFactory factory = new MessagePackTransportMessageCodecFactory();
ITransportMessageEncoder encoder = factory.GetEncoder();
ITransportMessageDecoder decoder = factory.GetDecoder();
byte[] vs = encoder.Encode(transportMessage);
TransportMessage message =decoder.Decode(vs);
Assert.AreEqual(message.Id, "");
Assert.AreEqual(message.ContentType, "Person");
Assert.AreEqual(((object[])message.Content)[].ToString(), "张宏伟" );
Assert.AreEqual(((object[])message.Content)[].ToString(), "");
} [MessagePackObject]
public class Person
{
[Key()]
public string Name { get; set; }
[Key()]
public int Age { get; set; }
}
}
(六)分布式通信----MessagePack序列化的更多相关文章
- CRL快速开发框架系列教程六(分布式缓存解决方案)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable
酒,是个好东西,前提要适量.今天参加了公司的年会,主题就是吃.喝.吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑 ...
- spring boot / cloud (十六) 分布式ID生成服务
spring boot / cloud (十六) 分布式ID生成服务 在几乎所有的分布式系统或者采用了分库/分表设计的系统中,几乎都会需要生成数据的唯一标识ID的需求, 常规做法,是使用数据库中的自动 ...
- axis实现webservices分布式通信
分布式通信原理 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2ZsMjAxMjEzMTQ=/font/5a6L5L2T/fontsize/400/fil ...
- 10.axis实现webservices分布式通信
转自:https://www.aliyun.com/jiaocheng/310112.html 分布式通信原理 基本原理:stub和skeleton作为客户端和服务端传输的中介,stub和skelet ...
- dotnet 使用 MessagePack 序列化对象
和很多序列化库一样,可以通过 MessagePack 序列化和反序列化,和 json 相比这个库提供了二进制的序列化,序列化之后的内容长度比 json 小很多 这个库能序列的内容不多,大多数时候建议使 ...
- 4.7 ROS分布式通信
4.7 ROS分布式通信 ROS是一个分布式计算环境.一个运行中的ROS系统可以包含分布在多台计算机上多个节点.根据系统的配置方式,任何节点可能随时需要与任何其他节点进行通信. 因此,ROS对网络配置 ...
- SignalR 中使用 MessagePack 序列化提高 WebSocket 通信性能
It's like JSON.but fast and small. MessagePack is an efficient binary serialization format. It lets ...
- (七)分布式通信----Netty实现NIO通信
目录 1. 消息监听器 2. 指令执行器 3. 消息发送器 4. 客户端工厂 5. 序列化工具 6. 通信主机 项目文件结构图 通信主机: 1. 消息监听器(黄色框) 这部分由 Netty 实现,Ne ...
随机推荐
- codemirror使用
JS使用 使用bower下载 bower i codemirror 引入样式文件 <link rel="stylesheet" type="text/css&quo ...
- C++ 八数码问题宽搜
C++ 八数码问题宽搜 题目描述 样例输入 (none) 样例输出 H--F--A AC代码 #include <iostream> #include <stdio.h> #i ...
- <表格>
一.列表 信息资源的一种展示形式 二.列表的分类 1.有序列表 <ol> <li>列表项1</li> <li>列表项2</li> </ ...
- 基于drone构建CI-CD系统
kubernetes集群三步安装 CI 概述 用一个可描述的配置定义整个工作流 程序员是很懒的动物,所以想各种办法解决重复劳动的问题,如果你的工作流中还在重复一些事,那么可能就得想想如何优化了 持续集 ...
- Linux零拷贝技术,看完这篇文章就懂了
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,欢迎大家关注,二维码文末可以扫. 本文讲解 ...
- SparkStreaming对接rabbitMQ
/** * SparkStreaming对接rabbitmq java代码 */public class SparkConsumerRabbit { public static void main(S ...
- 旁友数独会伐啦?python秒解数独了解下伐啦?
前几天和隔壁邻居玩斗地主被发现了,牌被没收了,斗地主是斗不了了,但我还想和邻居玩耍.如果你还想斗斗地主,戳:趁老王不在,和隔壁邻居斗斗地主,比比大小 想破脑袋终于让我想到一个游戏,数独!什么叫数独?数 ...
- 使用 OpenSSL为WindowsServer远程桌面(RDP)创建自签名证书 (Self-signed SSL certificate)
前言 笔者查阅很多资料,才写成此文章,如有错误,请读者们及时提出. 一般大家使用远程桌面(Remote Desktop)连接Windows Server时,总会有一个警告提示,如图1 图1 出现此警告 ...
- 【Java例题】2.2 分数类
2.定义分数类,包括分子和分母变量.构造方法. 加减乘除方法.化简方法.值计算方法和显示分子和分母的方法. 然后编写一个主类,在其主方法中通过定义两个分数对象来 显示每一个分数的分子值.分母值.化简和 ...
- asp.net core系列 70 即时通迅-WebSocket+Redis发布订阅
一.概述 在asp.net core 中可以用WebSocket 或asp.net core SignalR来开发即时通迅.在项目中由于开发前后端分离,对于SignalR前端技术人员不想依赖juqer ...