【问题标题】:Deserialize Map<byte[], byte[]> in Java在 Java 中反序列化 Map<byte[], byte[]>
【发布时间】:2017-12-15 04:29:51
【问题描述】:

我正在使用jedisredis 获取数据。

jedis.hgetall 返回我想要反序列化的Map&lt;byte[], byte[]&gt;

对于其他 redis 操作(如 hget),我可以使用 SerializationUtils.deserialize(byte[] objectData) 轻松反序列化,因为它们返回 byte[]

知道如何反序列化 byte[] 的 Map 吗?

【问题讨论】:

    标签: java serialization redis


    【解决方案1】:

    你可以在下面的方法中找到你想要的反序列化方法:

     import java.io.ByteArrayInputStream;
        import java.io.ByteArrayOutputStream;
        import java.io.ObjectInputStream;
        import java.io.ObjectOutputStream;
        import java.util.HashMap;
        import java.util.Map;
        import java.util.Set;
    
        public class SerializeUtil {
    
            /**
             * unserialize byte[]
             * @param bytes
             * @return Object
             */
            public static Object unserialize(final byte[] bytes) {
                ByteArrayInputStream bais = null;
                try {
                    bais = new ByteArrayInputStream(bytes);
                    ObjectInputStream ois = new ObjectInputStream(bais);
                    return ois.readObject();
                } catch (Exception e) {
    
                } 
                return null;
            }
    
            /**
             * unserialize hash Map<byte[], byte[]>
             * @param hash
             * @return Map<Object, Object>
             */
            public static Map<Object, Object> unserializehmbb2moo(final Map<byte[], byte[]> hash) {
                Map<Object, Object> result = new HashMap<Object, Object>();
                try {
                    Set<byte[]> keys = hash.keySet();
                    if (keys != null && keys.size() > 0) {
                        for (byte[] key : keys) {
                            result.put(unserialize(key), unserialize(hash.get(key)));
                        }
                    }
                } catch (Exception e) {
                }
                return result;
            }
    
    
            /**
             * unserialize hash Map<byte[], byte[]>
             * @param hash
             * @return Map<String, Object>
             */
            public static Map<String, Object> unserializehmbb2mso(final Map<byte[], byte[]> hash) {
                Map<String, Object> result = new HashMap<String, Object>();
                try {
                    Set<byte[]> keys = hash.keySet();
                    if (keys != null && keys.size() > 0) {
                        for (byte[] key : keys) {
                            result.put(unserialize(key).toString(), unserialize(hash.get(key)));
                        }
                    }
                } catch (Exception e) {
                }
                return result;
            }
        }
    

    【讨论】:

    • 谢谢我制定了相同的解决方案,仍然感谢您的回答。接受。
    【解决方案2】:

    您可以使用基于 Redis 的框架更轻松地做到这一点 - Redisson:

    Config config = new Confing();
    config.setCodec(new SerializationCodec());
    RedissonClient redisson = Redisson.create(config);
    
    Map<MyKey, MyObject> map = redisson.getMap("myMap");
    // both key and value objects are serialized transparently
    map.put(new MyKey(), new MyObject());
    
    // value object is deserialized transparently
    map.get(new MyKey());
    

    它提供多种编解码器,如Jackson JSONAvroAmazon IonSmileCBORMsgPackKryoFSTLZ4、@987654 和JDK Serialization 并允许您专注于业务逻辑开发,而不是使用 Jedis 进行序列化和连接处理...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多