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

    代码地址:https://github.com/msgpack/msgpack

    官网地址:http://msgpack.org/

    样例代码地址:https://github.com/nettm/public

   MessagePack的优势是速度比较快,支持众多语言,便于不同语言开发的系统之间交换数据。我在把对象序列化都转换成了字符串形式,是为了把对象存储到缓存中。我们日常项目中使用的数据形式包括对象、List、Set和Map,因此主要把这几种类型的数据进行了序列化及反序列化,支持对象中包含List、Set和Map。

首先在项目的pom文件中引入:


	org.msgpack
	msgpack
	0.6.12

代码MsgpackTest:

package com.nettm.serializable;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.codec.binary.Base64;
import org.msgpack.MessagePack;
import org.msgpack.template.SetTemplate;
import org.msgpack.template.Template;
import org.msgpack.template.Templates;
import org.testng.Assert;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

public class MsgpackTest {

    private long time;
    private MessagePack msgpack;

    @BeforeTest
    public void beforeTest() {
        time = System.currentTimeMillis();
        msgpack = new MessagePack();
        msgpack.register(CustomItemDto.class);
        msgpack.register(CustomCategoryDto.class);
    }

    @AfterTest
    public void afterTest() {
        msgpack.unregister();
        System.out.println(System.currentTimeMillis() - time);
    }

    @Test(invocationCount = 1, threadPoolSize = 1)
    public void testObject() {
        CustomItemDto val = new CustomItemDto();
        val.setId(10L);
        val.setItemCode("");
        val.setItemDespositPrice(32.45);
        val.setItemMemo(null);
        val.setItemName("张金");
        val.setItemPrice(89.02);
        val.setSort(10);

        String a = serializationObject(val);
        CustomItemDto newValue = deserializationObject(a, CustomItemDto.class);
        Assert.assertEquals(val.getId(), newValue.getId());
    }

    @Test(invocationCount = 1, threadPoolSize = 1)
    public void testList() {
        List lst = new ArrayList();
        for (int i = 0; i < 10; i++) {
            CustomItemDto val = new CustomItemDto();
            val.setId(10L);
            val.setItemCode("");
            val.setItemDespositPrice(32.45);
            val.setItemMemo(null);
            val.setItemName("张金");
            val.setItemPrice(89.02);
            val.setSort(10);
            lst.add(val);
        }

        String a = serializationList(lst, CustomItemDto.class);
        List newValue = deserializationList(a,
                CustomItemDto.class);
        Assert.assertEquals(lst.size(), newValue.size());
    }

    @Test(invocationCount = 1, threadPoolSize = 1)
    public void testBean() {
        List lst = new ArrayList();
        for (int j = 0; j < 10; j++) {
            CustomCategoryDto dto = new CustomCategoryDto();
            dto.setCategoryCode("ABCD_001");
            dto.setCategoryName("呼吸系统");
            for (int i = 0; i < 10; i++) {
                CustomItemDto val = new CustomItemDto();
                val.setId(10L);
                val.setItemCode("");
                val.setItemDespositPrice(32.45);
                val.setItemMemo(null);
                val.setItemName("张金");
                val.setItemPrice(89.02);
                val.setSort(10);
                dto.getCustomItemList().add(val);
            }
            for (int i = 0; i < 10; i++) {
                CustomItemDto val = new CustomItemDto();
                val.setId(Long.parseLong(String.valueOf(i)));
                val.setItemCode("");
                val.setItemDespositPrice(32.45);
                val.setItemMemo(null);
                val.setItemName("张金");
                val.setItemPrice(89.02);
                val.setSort(10);
                dto.getCustomItemSet().add(val);
            }
            for (int i = 0; i < 10; i++) {
                CustomItemDto val = new CustomItemDto();
                val.setId(Long.parseLong(String.valueOf(i)));
                val.setItemCode("");
                val.setItemDespositPrice(32.45);
                val.setItemMemo(null);
                val.setItemName("张金");
                val.setItemPrice(89.02);
                val.setSort(10);
                dto.getCustomItemMap().put(String.valueOf(i), val);
            }
            lst.add(dto);
        }

        String a = serializationList(lst, CustomCategoryDto.class);
        List newValue = deserializationList(a,
                CustomCategoryDto.class);
        Assert.assertEquals(lst.size(), newValue.size());
    }

    @Test(invocationCount = 1, threadPoolSize = 1)
    public void testMap() {
        Map map = new HashMap();
        for (int i = 0; i < 10; i++) {
            CustomItemDto val = new CustomItemDto();
            val.setId(10L);
            val.setItemCode("");
            val.setItemDespositPrice(32.45);
            val.setItemMemo(null);
            val.setItemName("张金");
            val.setItemPrice(89.02);
            val.setSort(10);
            map.put(new ObjectId().toString(), val);
        }

        String a = serializationMap(map, CustomItemDto.class);
        Map newValue = deserializationMap(a,
                CustomItemDto.class);
        Assert.assertEquals(map.size(), newValue.size());
    }

    @Test(invocationCount = 1, threadPoolSize = 1)
    public void testSet() {
        Set set = new HashSet();
        for (int i = 0; i < 10; i++) {
            CustomItemDto val = new CustomItemDto();
            val.setId(Long.parseLong(String.valueOf(i)));
            val.setItemCode("");
            val.setItemDespositPrice(32.45);
            val.setItemMemo(null);
            val.setItemName("金星");
            val.setItemPrice(89.02);
            val.setSort(10);
            set.add(val);
        }

        String a = serializationSet(set, CustomItemDto.class);
        Set newValue = deserializationSet(a, CustomItemDto.class);
        Assert.assertEquals(set.size(), newValue.size());
    }

    private  String serializationObject(T obj) {
        byte[] b = null;
        try {
            b = msgpack.write(obj);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new String(new Base64().encode(b));
    }

    private  T deserializationObject(String obj,
            Class clazz) {
        T t = null;
        byte[] bytes = new Base64().decode(obj.getBytes());
        try {
            t = msgpack.read(bytes, clazz);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return t;
    }

    private  String serializationList(List obj,
            Class clazz) {
        byte[] b = null;
        try {
            b = msgpack.write(obj);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new String(new Base64().encode(b));
    }

    private  List deserializationList(String obj,
            Class clazz) {
        Template elementTemplate = msgpack.lookup(clazz);
        Template> listTmpl = Templates.tList(elementTemplate);

        List t = null;
        byte[] bytes = new Base64().decode(obj.getBytes());
        try {
            t = msgpack.read(bytes, listTmpl);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return t;
    }

    private  String serializationMap(
            Map obj, Class clazz) {
        byte[] b = null;
        try {
            b = msgpack.write(obj);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new String(new Base64().encode(b));
    }

    private  Map deserializationMap(
            String obj, Class clazz) {
        Template elementTemplate = msgpack.lookup(clazz);
        Template> listTmpl = Templates.tMap(Templates.TString,
                elementTemplate);

        Map t = null;
        byte[] bytes = new Base64().decode(obj.getBytes());
        try {
            t = msgpack.read(bytes, listTmpl);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return t;
    }

    private  String serializationSet(Set obj,
            Class clazz) {
        Template elementTemplate = msgpack.lookup(clazz);
        byte[] b = null;
        try {
            b = msgpack.write(obj, new SetTemplate(elementTemplate));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new String(new Base64().encode(b));
    }

    private  Set deserializationSet(String obj,
            Class clazz) {
        Template elementTemplate = msgpack.lookup(clazz);
        Set t = null;
        byte[] bytes = new Base64().decode(obj.getBytes());
        try {
            t = msgpack.read(bytes, new SetTemplate(elementTemplate));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return t;
    }
}