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. oracle .bash_profile

    [oracle@redhat4 ~]$ vi .bash_profile # .bash_profile # Get the aliases and functionsif [ -f ~/.bashr ...

  2. Awesome-awesome-awesome

    Awesome-awesome-awesome A curated list of curated lists of awesome lists. awesome-awesomes @sindreso ...

  3. poj 3468 A Simple Problem with Integers (线段树 成段更新 加值 求和)

    题目链接 题意: 只有这两种操作 C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.&quo ...

  4. ha_innobase::open

    http://mysql.taobao.org/monthly/2015/08/07/ /******************************************************* ...

  5. C#将HTML导出Excel

    首先这个 不能用ajax 操作,不过 我现在讲的 这个方法和ajax 的效果一样. 你在你需要导出的页面写个方法 function DaoChu () { location.href = " ...

  6. android错误 Android NAND: nand_dev_load_disk_state,

    Android NAND: nand_dev_load_disk_state, 总是提示上面这个错误,我以为是内存分配不足呢,但是内存足够用也不行,后来在国外的网站上看到这个问题的解答,说是把用到的A ...

  7. Brew 编译mod错误Error: L6265E: Non-RWPI Section libspace.o(.bss) cannot be assigned to PI Exec region ER_ZI

    Error: L6265E: Non-RWPI Section libspace.o(.bss) cannot be assigned to PI Exec region ER_ZI.: Error: ...

  8. 推荐 15 个 Angular.js 应用扩展指令(参考应用)

    几天前我们看到Angular 1.4.0发布了-一个以社团为驱动的发布版本涵盖了400多个GitHub的提交,增加了对特性的提升,比如动画,以及可用性. 官方新闻发布稿 覆盖了绝大部分,这同样值得放于 ...

  9. Java [Leetcode 160]Intersection of Two Linked Lists

    题目描述: Write a program to find the node at which the intersection of two singly linked lists begins. ...

  10. Java [Leetcode 235]Lowest Common Ancestor of a Binary Search Tree

    题目描述: Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in ...