msgpack java_让java版msgpack支持Object类型
msgpack是一种高效的二进制序列化格式,官方链接提供了很多中语言的实现,Java作为常用的开发语言之一,官方也提供了支持。
Java版的实现官方也提供了一些QuickStart教程,这里就不多说了,主要说下之前遇到的一个问题,由于某个POJO对象里含有Map类型的成员,在使用msgpack进行序列化和反序列化时,出现了一些奇怪的现象,比如反序列化出来的Map在进行get时无法表现出正常的操作,虽然Debug时看到内存里确实有数据。后来简单分析了一下发现,在没有指定模板类型时,msgpack反序列化出来的Map实际上是其Jar包内自己封装的一个Map实现类,所以就会出现上述的情况,要解决这个问题,就需要在反序列化解析时,给msgpack明确指定模板类型。
msgpack的内置提供了很多模板,其中就有MapTemplate,这是一个泛型类,在构造时需要指定key和val的模板类型,而msgpack并没有内置Object的模板,所以当如果需要序列化和反序列化一个Value是Object的Map时,就会出现问题。因此我们需要自己来实现一个Object的模板,代码如下:
public class ObjectTemplate extends AbstractTemplate {
private ObjectTemplate() {
}
static public ObjectTemplate getInstance() {
return instance;
}
static final ObjectTemplate instance = new ObjectTemplate();
@Override
public void write(Packer pk, Object v, boolean required) throws IOException {
if (v == null) {
if (required) {
throw new MessageTypeException("Attempted to write null");
}
pk.writeNil();
return;
}
pk.write(v);
}
@Override
public Object read(Unpacker u, Object to, boolean required) throws IOException {
if (!required && u.trySkipNil()) {
return null;
}
return toObject(u.readValue());
}
private static Object toObject(Value value) throws IOException {
Converter conv = new Converter(value);
if (value.isNilValue()) { // null
return null;
} else if (value.isRawValue()) { // byte[] or String or maybe Date?
// deserialize value to String object
RawValue v = value.asRawValue();
return conv.read(Templates.TString);
} else if (value.isBooleanValue()) { // boolean
return conv.read(Templates.TBoolean);
} else if (value.isIntegerValue()) { // int or long or BigInteger
// deserialize value to int
IntegerValue v = value.asIntegerValue();
return conv.read(Templates.TInteger);
} else if (value.isFloatValue()) { // float or double
// deserialize value to double
FloatValue v = value.asFloatValue();
return conv.read(Templates.TDouble);
} else if (value.isArrayValue()) { // List or Set
// deserialize value to List object
ArrayValue v = value.asArrayValue();
List ret = new ArrayList(v.size());
for (Value elementValue : v) {
ret.add(toObject(elementValue));
}
return ret;
} else if (value.isMapValue()) { // Map
MapValue v = value.asMapValue();
Map map = new HashMap<>(v.size());
for (Map.Entry entry : v.entrySet()) {
Value key = entry.getKey();
Value val = entry.getValue();
map.put(toObject(key), toObject(val));
}
return map;
} else {
throw new RuntimeException("fatal error");
}
}
}
以上代码在issue4的基础上增加了支持基本类型作为K-V的Map的嵌套,我测试了三层嵌套Map是可以的,更深层的没有去测试,不过一般使用也应该够用了。以上模板在使用msgpack进行read和write时作为参数传递进去即可,如下面的例子 :
MessagePack pack = new MessagePack();
byte[] bytes = pack.write(map);
Map m = pack.read(bytes, Templates.tMap(Templates.TInteger, ObjectTemplate.getInstance()));
总体来说msgpack还是很好用的,所以在当我们用一个开源项目遇到问题时,先最好多看看文档和源码,很多时候就能解决我们遇到的问题,而不是过多的抱怨
msgpack java_让java版msgpack支持Object类型相关推荐
- java的switch支持包装类型吗?
java的switch支持包装类型吗? 包装类型能放在switch后面吗? 包装类型能放在case后面吗? JVM在处理基本类型和包装类型的区别 结论 参考 我们都知道java的switch支持6种数 ...
- java异步调用微信接口_微信支付V3 SDK(Java版,支持同步异步调用)
我们在开发微信支付时,发现微信官方已经对SDK做了升级,V3版本的SDK从设计上符合RESTful规范. 我们再在开源库中寻找是否有现成de开箱即用.并且支持响应式编程的SDK版本.经过一凡寻找,令我 ...
- 手机人人java_人人网JAVA版手机客户端软件功能详解
[IT168 软件频道]首先,安装好人人网的JAVA版本软件后,在手机的应用程序中可以找到人人2009(如图1). 图1 登录:运行人人2009软件,即会进入登录界面(如图2),点击登录,输入你的人人 ...
- Java版 人脸识别SDK demo
2019独角兽企业重金招聘Python工程师标准>>> 虹软人脸识别SDK之Java版,支持SDK 1.1+,以及2.0版本,滴滴,抓紧上车! 前言 由于业务需求,最近跟人脸识别杠上 ...
- HMCL支持什么java_最好用的Java版启动器HMCL
原标题:最好用的Java版启动器HMCL 推荐的启动器是什么了?就是 Hello Minecraft! Launcher 简称HMCL,这款启动器特色很多.一张图片简单说明!!! 支持离线登录代表了什 ...
- PyTorch 1.4 最新版放出:支持Python2的最后一版,支持分布式模型并行、Java程序、移动端等多项新功能...
点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自机器之心. 机器之心报道 参与:一鸣.Jamin 继 TensorFlow 更新后,PyTorch 也迎来了最新的 1.4 版.本次更新是最后 ...
- 顺丰java_顺丰API调用java版
顺丰API调用java版 发布时间:2018-09-04 18:06, 浏览次数:3351 , 标签: 顺丰,api,web service 一.获取顾客编码及校验码 https://qiao.sf- ...
- java支持arm64吗_VS2017预览版现已支持开发ARM64的UWP
原标题:VS2017预览版现已支持开发ARM64的UWP IT之家10月5日消息 今天,微软在其官方博客宣布,Visual Studio Version 15.9的第三个预览版已经发布.此版本的Vis ...
- Java 通用代码生成器光 2.3.0 文明 Beta10 版,支持从源码构建
Java 通用代码生成器光 2.3.0 文明 Beta10 版,支持从源码构建 Java 通用代码生成器光 2.3.0 文明已发布 Beta10 版,支持从源码构建代码生成器.您可以装好 JDK 和 ...
最新文章
- 解决外部符号错误:_main,_WinMain@16,__beginthreadex
- WINCE6.0+S3C2443下的activesync问题
- AutoHotKey程序防止反编译的简单手段
- 四元数左乘右乘_四元数、欧拉角学习笔记个人理解
- Linux:shell脚本命令: /dev/null 21 的理解
- c语言自定义一个函数求商和余数,c – 如何在一个步骤中获得商和余数?
- EditText,TextView显示图片,超链接,颜色等
- python手写一个迭代器_搞清楚 Python 的迭代器、可迭代对象、生成器
- P1879 [USACO06NOV]玉米田Corn Fields
- 启动凤凰系统出现android,凤凰系统重启后出现蓝屏时的解决方法
- Pyecharts之折线图与柱状图组合绘制
- 数据挖掘机器学习及其他领域数据集汇总
- 【无限互联】iOS开发视频教程— 2.8 iPhone开发之swtch语句
- chrome扩展-打造个性化的web页面
- 联想M490 开机U盘启动 快捷键
- 在文件选择打开方式里,无法添加.exe程序怎么解决
- 牛客--剑指offer,JZ3,JZ4,JZ5,JZ6
- 计算机病毒发展趋势论文,计算机病毒的发展趋势及对策
- mysql断网_MYSQL主从断网恢复复制的问题(1)
- STM32WB55_NUCLEO开发(2)----使用STM32CubeMX 生成的简单 BLE 应用程序连接手机APP
热门文章
- VS2019/MFC编程入门之对话框:向导对话框的创建及显示
- OpenCV计算机视觉实战 | 第5章 图像梯度算子
- Java多线程(四)线程并发的理解
- java的动态绑定机制
- 国产开源 GUI 引擎 AWTK 1.1 发布
- Labview 和信捷 XDH PLC Modbus tcp通讯
- 使用JQuery的turn.js库来实现翻书效果
- 乌克兰停电是哪种恶意程序_乌克兰开发商开发了19个30亿个应用程序,因为硅谷太无知了...
- 人脸识别系统代码C语言,利用摄像头动态人脸识别的系统,VC6.0编写,源代码齐全...
- 光线传媒与360合作敲定!双方建合资视频公司