zoukankan      html  css  js  c++  java
  • MessagePack Java 0.6.X 多种类型变量的序列化和反序列化(serialization/deserialization)

    类 Packer/Unpacker 允许序列化和反序列化多种类型的变量,如后续程序所示。这个类启用序列化和反序列化多种类型的变量和序列化主要类型变量以及包装类,String 对象,byte[] 对象, ByteBuffer 对象等的方法相似。

    如上面提示的,你可以序列化和反序列化你自己的对象,前提是你自己的对象需要使用 @Message 注解。

    package com.insight.demo.msgpack;
    
    import org.junit.Test;
    import org.msgpack.MessagePack;
    import org.msgpack.packer.Packer;
    import org.msgpack.unpacker.Unpacker;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.math.BigInteger;
    import java.nio.ByteBuffer;
    
    /**
     * MessagePack6Types
     *
     * @author yhu
     */
    public class MessagePack6Types {
        final Logger logger = LoggerFactory.getLogger(MessagePack6Types.class);
    
    
        /**
         * Test MessagePack6Types
         */
        @Test
        public void testMessagePack6Types() {
            logger.debug("testMessagePack6Types for Types");
    
            MessagePack msgpack = new MessagePack();
            try {
    
                //
                // Serialization
                //
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                Packer packer = msgpack.createPacker(out);
    
                // Serialize values of primitive types
                packer.write(true); // boolean value
                packer.write(10); // int value
                packer.write(10.5); // double value
    
                // Serialize objects of primitive wrapper types
                packer.write(Boolean.TRUE);
                packer.write(new Integer(10));
                packer.write(new Double(10.5));
    
                // Serialize various types of arrays
                packer.write(new int[]{1, 2, 3, 4});
                packer.write(new Double[]{10.5, 20.5});
                packer.write(new String[]{"msg", "pack", "for", "java"});
                packer.write(new byte[]{0x30, 0x31, 0x32}); // byte array
    
                // Serialize various types of other reference values
                packer.write("MessagePack"); // String object
                packer.write(ByteBuffer.wrap(new byte[]{0x30, 0x31, 0x32})); // ByteBuffer object
                packer.write(BigInteger.ONE); // BigInteger object
    
                //
                // Deserialization
                //
                byte[] bytes = out.toByteArray();
                ByteArrayInputStream in = new ByteArrayInputStream(bytes);
                Unpacker unpacker = msgpack.createUnpacker(in);
    
                // to primitive values
                boolean b = unpacker.readBoolean(); // boolean value
                int i = unpacker.readInt(); // int value
                double d = unpacker.readDouble(); // double value
    
                // to primitive wrapper value
                Boolean wb = unpacker.read(Boolean.class);
                Integer wi = unpacker.read(Integer.class);
                Double wd = unpacker.read(Double.class);
    
                // to arrays
                int[] ia = unpacker.read(int[].class);
                Double[] da = unpacker.read(Double[].class);
                String[] sa = unpacker.read(String[].class);
                byte[] ba = unpacker.read(byte[].class);
    
                // to String object, ByteBuffer object, BigInteger object, List object and Map object
                String ws = unpacker.read(String.class);
                ByteBuffer buf = unpacker.read(ByteBuffer.class);
                BigInteger bi = unpacker.read(BigInteger.class);
    
            } catch (Exception ex) {
                logger.error("MessagePack Serialization And Deserialization error", ex);
            }
        }
    }
    

    方法 Packer#write() 允许序列化多种类型的数据。

    类 Unpacker 针对反序列化二进制数据为主要变量,提供了一个反序列化方法。例如,你希望将二进制数据反序列化为 boolean (或者 int) 数据类型,你可以使用 Unpacker 中的 readBoolean (或者 readInt) 方法。

    Unpacker 同时也为参考变量提供了一个读取的方法。这个方法允许为一个参考变量从二进制数据中进行反序列化。参考变量的定义为你将类型指定为一个参数。例如,你希望反序列化二进制数据到 String (或者 byte[]) 对象,你必须在调用 read(String.class) (或者 read(byte[].class)) 方法的时候定义描述。

    https://www.cwiki.us/display/Serialization/QuickStart+For+MessagePack+Java+0.6.X

  • 相关阅读:
    $prufer$序列
    倍增
    二分
    英语词汇速查表
    ACM模拟赛
    Trie树
    关于军训的模拟赛-R2
    树上差分
    列队
    斜率优化dp
  • 原文地址:https://www.cnblogs.com/huyuchengus/p/11314413.html
Copyright © 2011-2022 走看看