Redis的序列化

摘要:
当类实现Serializable接口时,这意味着该类可以序列化。serialVersionUID相当于java类的ID卡,主要用于版本控制。serialVersionUID用于在序列化期间保持版本兼容性,即在版本升级期间保持对象的唯一性。如果未提供serialVersionUID,则序列化对象将存储在硬盘上,然后将添加或减少类字段。但是当serialVersionUID相同时,它将使用默认值type反序列化不同的字段。

本文参考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的序列化》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android Studio- 把项目提交到SVN中操作方法Linux大文件分割split和合并cat使用方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

centos7手动搭建redis集群

1、先安装redis yum  y install redis 2、进入usr/local cd /usr/local 3、创建文件夹redis-cluster mkdir redis-cluster 4、进入redis-cluster并建立六个文件夹7001,7002,7003,8001,8002,8003 cd rediscluster mkdir -...

路由协议之OSPF

目录 OSPF协议 OSPF的七种状态 OSPF的11种LSA Stub和Nssa OSPF中的防环机制 OSPF中的路由汇总和路由过滤 OSPF中的虚拟链路 虚拟链路有两种存在的意义 OSPF中的认证 华为模拟器中的配置 OSPF协议OSPF(Open Shortest Path First开放式最短路径优先)是一个内部网关协议IGP,用于在单一自治系...

关于大小型项目如何最大限度提高WebAPi性能

前言 WebAPi作为接口请求的一种服务,当我们请求该服务时我们目标是需要快速获取该服务的数据响应,这种情况在大型项目中尤为常见,此时迫切需要提高WebAPi的响应机制,当然也少不了前端需要作出的努力,这里我们只讲述在大小型项目中如何利用后台逻辑尽可能最大限度提高WebAPi性能,我们从以下几个方面来进行阐述。 性能提升一:JSON序列化器(Jil) 在....

六、redis AOF的持久化

1、AOF持久化的配置 AOF持久化,默认是关闭的,默认是打开RDB持久化 appendonly yes,可以打开AOF持久化机制,在生产环境里面,一般来说AOF都是要打开的,除非你说随便丢个几分钟的数据也无所谓 打开AOF持久化机制之后,redis每次接收到一条写命令,就会写入日志文件中,当然是先写入os cache的,然后每隔一定时间再fsync一下...

Python实战---制作专属有声小说(调用百度语音合成接口)

这一次的目标是使用百度云的人工智能接口,实现文字转语音的实时转换,将小说文字转换成语音朗读出来。 百度云接口调用 百度的这个接口对于我们普通用户非常友好,他的很多功能都是免费的,而且我们每天可以免费调用这个接口五千次,非常适合我们玩转这些功能。 注册百度云账号 首先打开百度云语音合成模块接口地址 打开网址后点击《立即使用》选项,然后会出现登录的选项界面。如...

Redis事务、持久化、发布订阅

一、Redis事物 1. 概念 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。 一个事务从开始到执行会经历以下三个阶段: 开始事务。 命...