Redis的序列化

Posted 奋斗的蜗牛cn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis的序列化相关的知识,希望对你有一定的参考价值。

本文参考http://www.cnblogs.com/yaobolove/p/5632891.html

Redis通过序列化存对象。

首先来了解为什么实现序列化接口?

    当一个类实现了Serializable接口(该接口仅标记为接口,不包含任何方法定义),表示该类可以序列化。序列化的目的是将一个实现了Serializable接口的对象转化成一个字节序列,可以把该字节序列保存起来(例如:保存在一个文件夹里),以后可以随时将该序列恢复成原来的对象。甚至可以将该字节序列放到其他计算机上或者通过网络传输到其他计算机上恢复,只要该计算机平台存在相应的类就可以正常恢复为原来的对象。

实现:要序列化一个对象,先要创建某些OutputStream对象,然后将其封装在一个ObjectOutputStream对象内,再调用writeObject()方法即可序列化一个对象;反序列化也类似。

注意:使用对象流写入到文件不仅要保证该对象是序列化的,而且该对象的成员对象也必须是序列化的

serialVersionUID

相当于java类的身份证,主要用于版本控制。serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍然保持对象的唯一性。如果没有提供serialVersionUID,对象序列化后存到硬盘上,再增加或减少类的field。这样,当反序列化时,就会出现Exception,造成不兼容问题。但当serialVersionUID相同时,它就会将不一样的field以type的缺省值反序列化。这样就可以避开不兼容问题了。

有两种生成方式:

  一个是默认的1L,例如:private static final long serialVersionUID = 1L;

  一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,例如: private static final long serialVersionUID = xxxxL; 

缺省值 就是默认的意思,不用再进行设置。

 

package redistest;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import redis.clients.jedis.Jedis;
public class SerializeUtil {
    public static void main(String[] args) {
        Jedis jedis=new Jedis("localhost");
        String keys="name";
        //存数据
        jedis.set(keys, "cn");
        //取数据
        String value=jedis.get(keys);
        System.out.println(value);
        
        //存对象
        Person p=new Person();
        p.setAge(18);
        p.setName("chengna");
        p.setId(1);
        jedis.set("person".getBytes(), serialize(p));
        byte[] byt=jedis.get("person".getBytes());
        Object obj = unserialize(byt);
        if(obj instanceof Person){
            System.out.println(obj);
        }
    }
    
    //序列化
    public static byte[] serialize(Object obj){
        ObjectOutputStream oos=null;
        ByteArrayOutputStream bos=null;
        try{
            bos=new ByteArrayOutputStream();
            oos=new ObjectOutputStream(bos);
            oos.writeObject(obj);
            byte[] byt=bos.toByteArray();
            return byt;
        }catch(IOException e){
            e.printStackTrace();
        }
        return null;
    }
    
    //反序列化
    public static Object unserialize(byte[] byt){
        ObjectInputStream ois=null;
        ByteArrayInputStream bis=null;
        bis=new ByteArrayInputStream(byt);
        try{
            ois=new ObjectInputStream(bis);
            Object obj=ois.readObject();
            return obj;
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }
}

 

 

 

 

以上是关于Redis的序列化的主要内容,如果未能解决你的问题,请参考以下文章

Spark闭包与序列化

如何利用redis来进行分布式集群系统的限流设计

Redis序列化和java存入Redis数据序列化反序列化总结

jedis连接redis

redis 如何存一个PHP数组 代码怎么写呢

原创Spring Data Redis <=2.0.3反序列化漏洞