最近想找个二进制序列化框架把对象存起来或者放到缓存里,首先排除了protobuf和thrift, 因为这两个都要写数据定义文件太烦,后来发现msgpack好像很不错的样子,决定试试
1.材料
msgpack-0.6.12.jar
2.先定义两个对象
package test.magpack; import org.msgpack.annotation.Message; @Message public class Message2 { public Message2(){ } public Message2(String name){ this.name = name; } public String name; }
package test.magpack; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.msgpack.annotation.Message; @Message // Annotation public class MyMessage { public String name; public double version; public List<String> list = new ArrayList<String>(); public Map<String, String> map = new HashMap<String, String>(); public List<Message2> list2 = new ArrayList<Message2>(); public Map<String, Message2> map2 = new HashMap<String, Message2>(); public Message2 message; }
3. 测试序列化与反序列化对象
public static void main(String[] args) throws IOException { System.setProperty("msgpack.dynamic-codegen.enabled", "false"); MyMessage src = new MyMessage(); src.name = "msgpack"; src.version = 0.6; src.list.add("1111"); src.list.add("2222"); src.map.put("a", "aaaa"); src.map.put("b", "bbbb"); src.message = new Message2("============="); src.list2.add(new Message2("sssss")); src.list2.add(new Message2("ffffff")); src.map2.put("aa", new Message2("xxxx")); src.map2.put("bb", new Message2("zzzz")); MessagePack msgpack = new MessagePack(); // Serialize byte[] bytes = msgpack.write(src); System.out.println(bytes.length); // Deserialize MyMessage dst = msgpack.read(bytes, MyMessage.class); System.out.println(dst.name); System.out.println(dst.version); System.out.println(dst.list); System.out.println(dst.map); System.out.println(dst.message.name); System.out.println(dst.list2); System.out.println(dst.map2); }
这个java的msgpack实现对 对象的嵌套和泛型,list, map都支持, 很好用