msgpack

msgpack简介 
MessagePack是一个基于二进制高效的对象序列化Library用于跨语言通信。 
它可以像JSON那样,在许多种语言之间交换结构对象;但是它比JSON更快速也更轻巧。 
支持Python、Ruby、Java、C/C++、Javascript等众多语言。 
比Google Protocol Buffers还要快4倍 

1. 下载 msgpack-0.5.1-devel.jar 
    建议从Maven仓库下 可能依赖的 jar 
    slf4j-api-1.4.3.jar 
    slf4j-log4j12-1.4.3.jar 
    log4j-1.2.13.jar 
    javassist-3.12.1.GA.jar 

2.  对JavaBean操作 
Java代码   收藏代码
  1. package com.mytest;  
  2.   
  3. /** 
  4.  *  
  5.  * 功能描述: 
  6.  *  
  7.  * @author lw 
  8.  * @created 2011-6-9 下午01:55:29 
  9.  * @version 1.0.0 
  10.  * @date 2011-6-9 下午01:55:29 
  11.  */  
  12.   
  13. import java.io.Serializable;  
  14.   
  15. import org.msgpack.annotation.MessagePackMessage;  
  16.   
  17. @MessagePackMessage    
  18. // Annotation  
  19. public class BeanClass implements Serializable{  
  20.     /** 
  21.      *  
  22.      */  
  23.     private static final long serialVersionUID = 1L;  
  24.       
  25.     // public fields are serialized.  
  26.     public String str;  
  27.     public double num;  
  28.     public String info;  
  29. }  


Java代码   收藏代码
  1. package com.mytest;  
  2.   
  3. /** 
  4.  *  
  5.  * 功能描述: 
  6.  *  
  7.  * @author lw 
  8.  * @created 2011-6-9 下午01:55:29 
  9.  * @version 1.0.0 
  10.  * @date 2011-6-9 下午01:55:29 
  11.  */  
  12. import java.util.HashMap;  
  13.   
  14. import org.msgpack.MessagePack;  
  15.   
  16. public class BeanMain {  
  17.   
  18.     public static void main(String[] args) {  
  19.         BeanClass src = new BeanClass();  
  20.         src.str = "msgpack";  
  21.         src.num = 0.5;  
  22.         src.info = "This is msgpack";  
  23.         HashMap<String, String> map = new HashMap<String, String>();  
  24.         map.put("src""src----");  
  25.   
  26.         // Serialize  
  27.         byte[] raw = MessagePack.pack(src);  
  28.   
  29.         // Deserialize  
  30.         BeanClass dst = MessagePack.unpack(raw, BeanClass.class);  
  31.         System.out.println(dst.str + ":" + dst.num);  
  32.     }  
  33. }  

3.  对Map,List操作 
Java代码   收藏代码
  1. package com.mytest;  
  2.   
  3. import static org.msgpack.Templates.TAny;  
  4. import static org.msgpack.Templates.TString;  
  5. import static org.msgpack.Templates.tList;  
  6. import static org.msgpack.Templates.tMap;  
  7.   
  8. import java.util.ArrayList;  
  9. import java.util.HashMap;  
  10. import java.util.Iterator;  
  11. import java.util.List;  
  12. import java.util.Map;  
  13.   
  14. import org.msgpack.MessagePack;  
  15. import org.msgpack.Template;  
  16. import org.msgpack.object.ArrayType;  
  17. import org.msgpack.object.BooleanType;  
  18. import org.msgpack.object.FloatType;  
  19. import org.msgpack.object.IntegerType;  
  20. import org.msgpack.object.RawType;  
  21.   
  22. /** 
  23.  *  
  24.  * 功能描述: 
  25.  *  
  26.  * @author lw 
  27.  * @created 2011-6-13 上午09:33:11 
  28.  * @version 1.0.0 
  29.  * @date 2011-6-13 上午09:33:11 
  30.  */  
  31.   
  32. public class RawTypeUtil {  
  33.       
  34.     /** 
  35.      *  
  36.      * Object 
  37.      * 
  38.      * @param arg0 
  39.      * @return 
  40.      */  
  41.     public static Object unpackToObject(byte[] arg0) {  
  42.         return unpackToObject(arg0, TAny);  
  43.     }  
  44.       
  45.     /** 
  46.      *  
  47.      * Object 
  48.      * 
  49.      * @param arg0 
  50.      * @param arg1 
  51.      * @return 
  52.      */  
  53.     public static Object unpackToObject(byte[] arg0, Template arg1) {  
  54.         Object obj = (Object) MessagePack.unpack(arg0, arg1);  
  55.         return rawObjToObj(obj);  
  56.     }  
  57.       
  58.     /** 
  59.      *  
  60.      * Map 
  61.      * 
  62.      * @param arg0 
  63.      * @return 
  64.      */  
  65.     public static Map<String, Object> unpackToMap(byte[] arg0) {  
  66.         return unpackToMap(arg0, tMap(TString, TAny));  
  67.     }  
  68.       
  69.     /** 
  70.      *  
  71.      * Map 
  72.      * 
  73.      * @param arg0 
  74.      * @param arg1 
  75.      * @return 
  76.      */  
  77.     public static Map<String, Object> unpackToMap(byte[] arg0, Template arg1) {  
  78.         @SuppressWarnings("unchecked")  
  79.         Map<String, Object> dst = (Map<String, Object>) MessagePack.unpack(arg0, arg1);  
  80.         return rawtypeMapConvert(dst);  
  81.     }  
  82.       
  83.     /** 
  84.      *  
  85.      * List 
  86.      * 
  87.      * @param arg0 
  88.      * @return 
  89.      */  
  90.     public static List<Map<String, Object>> unpackToList(byte[] arg0) {  
  91.         return unpackToList(arg0, tList(tMap(TString, TAny)));  
  92.     }  
  93.       
  94.     /** 
  95.      *  
  96.      * List 
  97.      * 
  98.      * @param arg0 
  99.      * @param arg1 
  100.      * @return 
  101.      */  
  102.     public static List<Map<String, Object>> unpackToList(byte[] arg0, Template arg1) {  
  103.         @SuppressWarnings("unchecked")  
  104.         List<Map<String, Object>> dst = (List<Map<String, Object>>) MessagePack.unpack(arg0, arg1);  
  105.         return rawtypeListConvert(dst);  
  106.     }  
  107.       
  108.     private static List<Map<String, Object>> rawtypeListConvert(final List<Map<String, Object>> list) {  
  109.         List<Map<String,Object>> rList = new ArrayList<Map<String,Object>>();  
  110.         Map<String, Object> map = new HashMap<String, Object>();  
  111.         for(Map<String, Object> s : list) {  
  112.             map = rawtypeMapConvert(s);  
  113.             rList.add(map);  
  114.         }  
  115.         return rList;  
  116.     }  
  117.       
  118.     private static Map<String, Object> rawtypeMapConvert (  
  119.             final Map<String, Object> params) {  
  120.         Map<String, Object> rParams = new HashMap<String, Object>(0);  
  121.         Iterator<String> iterator = params.keySet().iterator();  
  122.         while (iterator.hasNext()) {  
  123.             String key = (String) iterator.next();  
  124.             Object objResu = rawObjToObj(params.get(key));  
  125.             rParams.put(key, objResu);  
  126.         }  
  127.         return rParams;  
  128.     }  
  129.   
  130.     private static Object rawObjToObj(Object obj) {  
  131.         Object objResu = null;  
  132.         if (obj instanceof IntegerType) {  
  133.             objResu = ((IntegerType) obj).asInt();  
  134.         } else if (obj instanceof ArrayType) {  
  135.             objResu = ((ArrayType) obj).asArray();  
  136.         } else if (obj instanceof BooleanType) {  
  137.             objResu = ((BooleanType) obj).asBoolean();  
  138.         } else if (obj instanceof FloatType) {  
  139.             objResu = ((FloatType) obj).asFloat();  
  140.         } else {  
  141.             objResu = ((RawType) obj).asString();  
  142.         }  
  143.         return objResu;  
  144.     }  
  145. }  


Java代码   收藏代码
  1. package com.mytest;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. import org.msgpack.MessagePack;  
  7.   
  8. /** 
  9.  *  
  10.  * 功能描述: 
  11.  *  
  12.  * @author lw 
  13.  * @created 2011-6-13 上午09:12:07 
  14.  * @version 1.0.0 
  15.  * @date 2011-6-13 上午09:12:07 
  16.  */  
  17.   
  18. public class MapMain {  
  19.     public static void main(String[] args) {  
  20.         Map<String, Object> map = new HashMap<String, Object>();  
  21.         map.put("t""aa1");  
  22.         map.put("f"111);  
  23.   
  24.         byte[] raw = MessagePack.pack(map);  
  25.   
  26.         map = RawTypeUtil.unpackToMap(raw);  
  27.         System.out.println(map.get("t").toString() + " : "  
  28.                 + map.get("f").toString());  
  29.     }  
  30. }  


Java代码   收藏代码
  1. package com.mytest;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import org.msgpack.MessagePack;  
  9.   
  10. /** 
  11.  *  
  12.  *  
  13.  * 功能描述: 
  14.  *  
  15.  * @author lw 
  16.  * @created 2011-6-13 上午09:12:30 
  17.  * @version 1.0.0 
  18.  * @date 2011-6-13 上午09:12:30 
  19.  */  
  20. public class ListMain {  
  21.   
  22.     public static void main(String[] args) {  
  23.         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
  24.         Map<String, Object> map1 = new HashMap<String, Object>();  
  25.         map1.put("t""aa1");  
  26.         map1.put("f"111);  
  27.         Map<String, Object> map2 = new HashMap<String, Object>();  
  28.         map2.put("t""aa2");  
  29.         map2.put("f"333);  
  30.         list.add(map1);  
  31.         list.add(map2);  
  32.   
  33.         byte[] raw = MessagePack.pack(list);  
  34.         List<Map<String, Object>> rList = new ArrayList<Map<String, Object>>();  
  35.         rList = RawTypeUtil.unpackToList(raw);  
  36.         for (Map<String, Object> s : rList) {  
  37.             System.out.println(s.get("t") + " : " + s.get("f"));  
  38.         }  
  39.     }  
  40. }  
 
======================= MessagePack for Python ======================= :author: INADA Naoki :version: 0.4.1 :date: 2014-02-17 .. image:: https://secure.travis-ci.org/msgpack/msgpack-python.png :target: https://travis-ci.org/#!/msgpack/msgpack-python What's this ------------ `MessagePack <http://msgpack.org/>`_ is a fast, compact binary serialization format, suitable for similar data to JSON. This package provides CPython bindings for reading and writing MessagePack data. Install --------- You can use ``pip`` or ``easy_install`` to install msgpack:: $ easy_install msgpack-python or $ pip install msgpack-python PyPy ^^^^^ msgpack-python provides pure python implementation. PyPy can use this. Windows ^^^^^^^ When you can't use binary distribution, you need to install Visual Studio or Windows SDK on Windows. (NOTE: Visual C++ Express 2010 doesn't support amd64. Windows SDK is recommanded way to build amd64 msgpack without any fee.) Without extension, using pure python implementation on CPython runs slowly. Notes ----- Note for msgpack 2.0 support ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ msgpack 2.0 adds two types: *bin* and *ext*. *raw* was bytes or string type like Python 2's ``str``. To distinguish string and bytes, msgpack 2.0 adds *bin*. It is non-string binary like Python 3's ``bytes``. To use *bin* type for packing ``bytes``, pass ``use_bin_type=True`` to packer argument. >>> import msgpack >>> packed = msgpack.packb([b'spam', u'egg'], use_bin_type=True) >>> msgpack.unpackb(packed, encoding='utf-8') ['spam', u'egg'] You shoud use it carefully. When you use ``use_bin_type=True``, packed binary can be unpacked by unpackers supporting msgpack-2.0. To use *ext* type, pass ``msgpack.ExtType`` object to packer. >>> import msgpack >>> packed = msgpack.packb(msgpack.ExtType(42, b'xyzzy')) >>> msgpack.unpackb(packed) ExtType(code=42, data='xyzzy') You can use it with ``default`` and ``ext_hook``. See below. Note for msgpack 0.2.x users ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The msgpack 0.3 have some incompatible changes. The default value of ``use_list`` keyword argument is ``True`` from 0.3. You should pass the argument explicitly for backward compatibility. `Unpacker.unpack()` and some unpack methods now raises `OutOfData` instead of `StopIteration`. `StopIteration` is used for iterator protocol only. How to use ----------- One-shot pack & unpack ^^^^^^^^^^^^^^^^^^^^^^ Use ``packb`` for packing and ``unpackb`` for unpacking. msgpack provides ``dumps`` and ``loads`` as alias for compatibility with ``json`` and ``pickle``. ``pack`` and ``dump`` packs to file-like object. ``unpack`` and ``load`` unpacks from file-like object. :: >>> import msgpack >>> msgpack.packb([1, 2, 3]) '\x93\x01\x02\x03' >>> msgpack.unpackb(_) [1, 2, 3] ``unpack`` unpacks msgpack's array to Python's list, but can unpack to tuple:: >>> msgpack.unpackb(b'\x93\x01\x02\x03', use_list=False) (1, 2, 3) You should always pass the ``use_list`` keyword argument. See performance issues relating to use_list_ below. Read the docstring for other options. Streaming unpacking ^^^^^^^^^^^^^^^^^^^ ``Unpacker`` is a "streaming unpacker". It unpacks multiple objects from one stream (or from bytes provided through its ``feed`` method). :: import msgpack from io import BytesIO buf = BytesIO() for i in range(100): buf.write(msgpack.packb(range(i))) buf.seek(0) unpacker = msgpack.Unpacker(buf) for unpacked in unpacker: print unpacked Packing/unpacking of custom data type ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It is also possible to pack/unpack custom data types. Here is an example for ``datetime.datetime``. :: import datetime import msgpack useful_dict = { "id": 1, "created": datetime.datetime.now(), } def decode_datetime(obj): if b'__datetime__' in obj: obj = datetime.datetime.strptime(obj["as_str"], "%Y%m%dT%H:%M:%S.%f") return obj def encode_datetime(obj): if isinstance(obj, datetime.datetime): return {'__datetime__': True, 'as_str': obj.strftime("%Y%m%dT%H:%M:%S.%f")} return obj packed_dict = msgpack.packb(useful_dict, default=encode_datetime) this_dict_again = msgpack.unpackb(packed_dict, object_hook=decode_datetime) ``Unpacker``'s ``object_hook`` callback receives a dict; the ``object_pairs_hook`` callback may instead be used to receive a list of key-value pairs. Extended types ^^^^^^^^^^^^^^^ It is also possible to pack/unpack custom data types using the msgpack 2.0 feature. >>> import msgpack >>> import array >>> def default(obj): ... if isinstance(obj, array.array) and obj.typecode == 'd': ... return msgpack.ExtType(42, obj.tostring()) ... raise TypeError("Unknown type: %r" % (obj,)) ... >>> def ext_hook(code, data): ... if code == 42: ... a = array.array('d') ... a.fromstring(data) ... return a ... return ExtType(code, data) ... >>> data = array.array('d', [1.2, 3.4]) >>> packed = msgpack.packb(data, default=default) >>> unpacked = msgpack.unpackb(packed, ext_hook=ext_hook) >>> data == unpacked True Advanced unpacking control ^^^^^^^^^^^^^^^^^^^^^^^^^^ As an alternative to iteration, ``Unpacker`` objects provide ``unpack``, ``skip``, ``read_array_header`` and ``read_map_header`` methods. The former two read an entire message from the stream, respectively deserialising and returning the result, or ignoring it. The latter two methods return the number of elements in the upcoming container, so that each element in an array, or key-value pair in a map, can be unpacked or skipped individually. Each of these methods may optionally write the packed data it reads to a callback function: :: from io import BytesIO def distribute(unpacker, get_worker): nelems = unpacker.read_map_header() for i in range(nelems): # Select a worker for the given key key = unpacker.unpack() worker = get_worker(key) # Send the value as a packed message to worker bytestream = BytesIO() unpacker.skip(bytestream.write) worker.send(bytestream.getvalue()) Note about performance ------------------------ GC ^^ CPython's GC starts when growing allocated object. This means unpacking may cause useless GC. You can use ``gc.disable()`` when unpacking large message. `use_list` option ^^^^^^^^^^^^^^^^^^ List is the default sequence type of Python. But tuple is lighter than list. You can use ``use_list=False`` while unpacking when performance is important. Python's dict can't use list as key and MessagePack allows array for key of mapping. ``use_list=False`` allows unpacking such message. Another way to unpacking such object is using ``object_pairs_hook``. Test ---- MessagePack uses `pytest` for testing. Run test with following command: $ py.test .. vim: filetype=rst
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值