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类型相关推荐

  1. java的switch支持包装类型吗?

    java的switch支持包装类型吗? 包装类型能放在switch后面吗? 包装类型能放在case后面吗? JVM在处理基本类型和包装类型的区别 结论 参考 我们都知道java的switch支持6种数 ...

  2. java异步调用微信接口_微信支付V3 SDK(Java版,支持同步异步调用)

    我们在开发微信支付时,发现微信官方已经对SDK做了升级,V3版本的SDK从设计上符合RESTful规范. 我们再在开源库中寻找是否有现成de开箱即用.并且支持响应式编程的SDK版本.经过一凡寻找,令我 ...

  3. 手机人人java_人人网JAVA版手机客户端软件功能详解

    [IT168 软件频道]首先,安装好人人网的JAVA版本软件后,在手机的应用程序中可以找到人人2009(如图1). 图1 登录:运行人人2009软件,即会进入登录界面(如图2),点击登录,输入你的人人 ...

  4. Java版 人脸识别SDK demo

    2019独角兽企业重金招聘Python工程师标准>>> 虹软人脸识别SDK之Java版,支持SDK 1.1+,以及2.0版本,滴滴,抓紧上车! 前言 由于业务需求,最近跟人脸识别杠上 ...

  5. HMCL支持什么java_最好用的Java版启动器HMCL

    原标题:最好用的Java版启动器HMCL 推荐的启动器是什么了?就是 Hello Minecraft! Launcher 简称HMCL,这款启动器特色很多.一张图片简单说明!!! 支持离线登录代表了什 ...

  6. PyTorch 1.4 最新版放出:支持Python2的最后一版,支持分布式模型并行、Java程序、移动端等多项新功能...

    点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自机器之心. 机器之心报道 参与:一鸣.Jamin 继 TensorFlow 更新后,PyTorch 也迎来了最新的 1.4 版.本次更新是最后 ...

  7. 顺丰java_顺丰API调用java版

    顺丰API调用java版 发布时间:2018-09-04 18:06, 浏览次数:3351 , 标签: 顺丰,api,web service 一.获取顾客编码及校验码 https://qiao.sf- ...

  8. java支持arm64吗_VS2017预览版现已支持开发ARM64的UWP

    原标题:VS2017预览版现已支持开发ARM64的UWP IT之家10月5日消息 今天,微软在其官方博客宣布,Visual Studio Version 15.9的第三个预览版已经发布.此版本的Vis ...

  9. Java 通用代码生成器光 2.3.0 文明 Beta10 版,支持从源码构建

    Java 通用代码生成器光 2.3.0 文明 Beta10 版,支持从源码构建 Java 通用代码生成器光 2.3.0 文明已发布 Beta10 版,支持从源码构建代码生成器.您可以装好 JDK 和 ...

最新文章

  1. 解决外部符号错误:_main,_WinMain@16,__beginthreadex
  2. WINCE6.0+S3C2443下的activesync问题
  3. AutoHotKey程序防止反编译的简单手段
  4. 四元数左乘右乘_四元数、欧拉角学习笔记个人理解
  5. Linux:shell脚本命令: /dev/null 21 的理解
  6. c语言自定义一个函数求商和余数,c – 如何在一个步骤中获得商和余数?
  7. EditText,TextView显示图片,超链接,颜色等
  8. python手写一个迭代器_搞清楚 Python 的迭代器、可迭代对象、生成器
  9. P1879 [USACO06NOV]玉米田Corn Fields
  10. 启动凤凰系统出现android,凤凰系统重启后出现蓝屏时的解决方法
  11. Pyecharts之折线图与柱状图组合绘制
  12. 数据挖掘机器学习及其他领域数据集汇总
  13. 【无限互联】iOS开发视频教程— 2.8 iPhone开发之swtch语句
  14. chrome扩展-打造个性化的web页面
  15. 联想M490 开机U盘启动 快捷键
  16. 在文件选择打开方式里,无法添加.exe程序怎么解决
  17. 牛客--剑指offer,JZ3,JZ4,JZ5,JZ6
  18. 计算机病毒发展趋势论文,计算机病毒的发展趋势及对策
  19. mysql断网_MYSQL主从断网恢复复制的问题(1)
  20. STM32WB55_NUCLEO开发(2)----使用STM32CubeMX 生成的简单 BLE 应用程序连接手机APP

热门文章

  1. VS2019/MFC编程入门之对话框:向导对话框的创建及显示
  2. OpenCV计算机视觉实战 | 第5章 图像梯度算子
  3. Java多线程(四)线程并发的理解
  4. java的动态绑定机制
  5. 国产开源 GUI 引擎 AWTK 1.1 发布
  6. Labview 和信捷 XDH PLC Modbus tcp通讯
  7. 使用JQuery的turn.js库来实现翻书效果
  8. 乌克兰停电是哪种恶意程序_乌克兰开发商开发了19个30亿个应用程序,因为硅谷太无知了...
  9. 人脸识别系统代码C语言,利用摄像头动态人脸识别的系统,VC6.0编写,源代码齐全...
  10. 光线传媒与360合作敲定!双方建合资视频公司