MSGPACK跨平台的数据序列规范,为多种语言所支持。用它序列还是还原数据都异常方便。

而且它支持序列的数据格式非常之多,因为它支持的数据格式多,所以MSGPACK的第二功用:缓存。

DELPHI的MSGPACK类库,优秀的QDAC开源项目提供了很好的实现方法。

闲话少说,直接上码。

变量定义:

var

FMsgPack:TSimpleMsgPack;
FSendStream:TMemoryStream;
FRecvStream:TMemoryStream;

创建对象

FMsgPack := TSimpleMsgPack.Create;
FRecvStream := TMemoryStream.Create;
FSendStream := TMemoryStream.Create;

序列数据并发送

FSendStream.Clear;
FRecvStream.Clear;
FMsgPack.Clear;
FMsgPack.ForcePathObject('cmd.index').AsInteger := 1;
FMsgPack.ForcePathObject('cmd.data').AsVariant := vData;
FMsgPack.EncodeToStream(FSendStream);

TStreamCoderSocket.SendStream( FSendStream);

接收数据并还原

procedure TMyClientContext.dataReceived(const pvDataObject: TObject);
var
lvMsgPack, lvMsgPack2:TSimpleMsgPack;
lvStream :TStream;
lvStream2:TMemoryStream;
vData:OleVariant;
lvResult:Boolean;
vMsg:String;
begin
lvMsgPack := TSimpleMsgPack.Create;
try
try
if FdmMain = nil then FdmMain := TdmMain.Create(nil);

lvStream := TStream(pvDataObject);
lvStream.Position := 0;

lvStream.Position := 0;

// unpack
lvMsgPack.DecodeFromStream(lvStream);

// get param
vData := lvMsgPack.ForcePathObject('cmd.data').AsVariant;

// invoke dataModule function
lvResult := FdmMain.Execute(lvMsgPack.ForcePathObject('cmd.index').AsInteger,
vData, vMsg);

// write result info
lvMsgPack.Clear;
lvMsgPack.ForcePathObject('__result.result').AsBoolean := lvResult;
lvMsgPack.ForcePathObject('__result.data').AsVariant := vData;
lvMsgPack.ForcePathObject('__result.msg').AsString := vMsg;
except
on E:Exception do
begin
lvMsgPack.Clear;
lvMsgPack.ForcePathObject('__result.result').AsBoolean := false;
lvMsgPack.ForcePathObject('__result.msg').AsString := e.Message;
end;
end;

lvStream.Size := 0;
lvMsgPack.EncodeToStream(lvStream);

lvStream.Position := 0;

// zipStream
TZipTools.compressStreamEX(lvStream);
lvStream.Position := 0;

// send to client
self.writeObject(lvStream);
finally
lvMsgPack.Free;
end;

end;

MSGPACK(一)的更多相关文章

  1. Python下Json和Msgpack序列化比较

     最近用Python时,遇到了序列化对象的问题,传统的json和新型序列化工具包msgpack都有涉及,于是做一个简单的总结: 通俗的讲:序列化:将对象信息转化为可以存储或传输的形式:反序列化:把这个 ...

  2. serialize data use msgpack

    #ifndef _BYTEBUFFER_H #define _BYTEBUFFER_H #include <msgpack.hpp> typedef unsigned char uint8 ...

  3. json,serialize,msgpack比较

    速度 在redis中存入同样的压缩数据,取操作执行两个操作: 1 从redis中取 2 解压 3 统一json压缩后放出   ab测试: [yejianfeng@openstack ~/httpd/u ...

  4. 重点关注之自定义序列化方式(Protobuf和Msgpack)

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

  5. Redis 数据序列化方法 serialize, msgpack, json, hprose 比较

    最近弄 Redis ,涉及数据序列化存储的问题,对比了:JSON, Serialize, Msgpack, Hprose 四种方式 1. 对序列化后的字符串长度对比: 测试代码: $arr = [0, ...

  6. msgpack库的神奇用法

    一般来说,我们会把头部和实际消息分开定义,因为内部工作的worker之间发送消息有些额外的字段,这些字段不属于实际的消息.这时候我们会把worker消息中一个字段定义为interface{}或者obj ...

  7. [skill][msgpack] 初试msgpack库以及基本使用

    It's like JSON.   but fast and small. http://msgpack.org/index.html 源码: https://github.com/msgpack/m ...

  8. Python中msgpack库的使用

    msgpack用起来像json,但是却比json快,并且序列化以后的数据长度更小,言外之意,使用msgpack不仅序列化和反序列化的速度快,数据传输量也比json格式小,msgpack同样支持多种语言 ...

  9. msgpack生成lib,vs新建lib等

    记录导师交给的任务 新建一个c++项目,运行老师的msgpack的cpp文件,然后会生成相应的lib,我做的东西需要调用到它(这是老师改写后的msgpack的lib) 我的任务是建一个静态库,将客户端 ...

随机推荐

  1. 我的MYSQL学习心得

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  2. bzoj1834: [ZJOI2010]network 网络扩容

    努力看了很久样例一直过不了...然后各种输出中间过程啊巴拉巴拉弄了1h,没办法了...然后突然想到啊原来的边可以用啊为什么不用...于是A了...感人肺腑 #include<cstdio> ...

  3. Jquery 模板插件 jquery.tmpl.js 的使用方法(2):嵌套each循环,temp调用(使用预编译的模板缓存)

    直接上代码吧 一:主窗口 /*#region SendChooseTargetTemplate 发送候选人主窗口模板*/ var SendChooseTargetTemplate = ''; Send ...

  4. EF4.0和EF5.0增删改查的写法区别及执行Sql的方法

    EF4.0和EF5.0增删改查的写法区别 public T AddEntity(T entity) { //EF4.0的写法 添加实体 //db.CreateObjectSet<T>(). ...

  5. POJ 1966 Cable TV Network (无向图点连通度)

    [题意]给出一个由n个点,m条边组成的无向图.求最少去掉多少点才能使得图中存在两点,它们之间不连通. [思路]回想一下s->t的最小点割,就是去掉多少个点能使得s.t不连通.那么求点连通度就枚举 ...

  6. datatables 服务器返回数据后的处理-表格数据属性的操作方法(ajax.dataSrc)

    http://dt.thxopen.com/reference/option/ajax.dataSrc.html http://datatables.net/reference/option/ajax ...

  7. ffmpeg显示视频

    项目最近需要实现播放视频功能,这个在上家公司就做过.虽然跟之前的场景不一样,有以前的功底还是很快可以解决,事实也确实如此.在使用DShow处理完视频分割与合并后,继续使用DShow显示视频,很快即完成 ...

  8. Oracle中获取执行计划的几种方法分析

    以下是对Oracle中获取执行计划的几种方法进行了详细的分析介绍,需要的朋友可以参考下     1. 预估执行计划 - Explain PlanExplain plan以SQL语句作为输入,得到这条S ...

  9. 【JS】<c:foreach>用法

    <c:foreach>类似于for和foreach循环   以下是我目前见过的用法: 1.循环遍历,输出所有的元素. <c:foreach items="${list}&q ...

  10. [转]Android调用so文件(C代码库)方法详解

    一.为什么调用c的dll要用源码编译成so库 Android系统是基于linux内核的移动终端系统,而dll是在windows环境下生成和调用的c库,所以不可以直接为android系统调用. 二.安装 ...