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;
    }
}

 

时间: 2024-08-29 08:35:19

Redis的序列化的相关文章

Redis 数据序列化方法 serialize, msgpack, json, hprose 比较

最近弄 Redis ,涉及数据序列化存储的问题,对比了:JSON, Serialize, Msgpack, Hprose 四种方式 1. 对序列化后的字符串长度对比: 测试代码: $arr = [0, 1, 2, 'a', 'b', 'c', 'd', 'a'=>'12', '包含中文', 'abcd包含中文efg'=>'abc一二三四defg', '键名'=>['abc'=>['def'=>123, 456, 'abcd中文内容efg'], 'a之间c'=>['a'=

Redis之序列化POJO

redis存储方式有很多种,但是我个人觉得最好用的并非是String存储类型,而是Hash存储类型,如果在使用redis的时候单纯的只使用到String存储类型的话,我个人觉得完全体现不了redis的特性. redis 是一个key-value数据库,但在我看来他并不是单纯的key-value数据库,因为他相对于其他同类型的nosql数据来讲,redis提供了更多数据类型存储格式.比如如果需要使用nosql类型的数据库作为应用的缓存,我相信memcached比redis更适合,但是现实中往往很多

Spring Cache Redis 修改序列化方式

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId&

redis使用Jackson2JsonRedisSerializer序列化问题

一.spring boot 集成Redis方法 依赖 <!--redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.apache.c

一文彻底理解Redis序列化协议,你也可以编写Redis客户端

前提 最近学习Netty的时候想做一个基于Redis服务协议的编码解码模块,过程中顺便阅读了Redis服务序列化协议RESP,结合自己的理解对文档进行了翻译并且简单实现了RESP基于Java语言的解析.编写本文的使用使用的JDK版本为[8+]. RESP简介 Redis客户端与Redis服务端基于一个称作RESP的协议进行通信,RESP全称为Redis Serialization Protocol,也就是Redis序列化协议.虽然RESP为Redis设计,但是它也可以应用在其他客户端-服务端(C

redis.conf for Chinese

#引用其他配置文件 # include /path/to/local.conf # include /path/to/other.conf #是否daemon运行no,yes daemonize no #pid文件的位置 pidfile /tmp/redis.pid #开放的端口号 port 6379 #listen队列的长度 tcp-backlog 511 #绑定ip地址,多个ip用空格分隔 bind 127.0.0.1 #我没有用到 # unixsocket /tmp/redis.sock

Spring Cache For Redis

一.概述 缓存(Caching)可以存储经常会用到的信息,这样每次需要的时候,这些信息都是立即可用的. 常用的缓存数据库: Redis   使用内存存储(in-memory)的非关系数据库,字符串.列表.集合.散列表.有序集合,每种数据类型都有自己的专属命令.另外还有批量操作(bulk operation)和不完全(partial)的事务支持 .发布与订阅.主从复制(master/slave replication).持久化.脚本(存储过程,stored procedure). 效率比ehcac

JAVA 框架 Spring Cache For Redis.

一.概述 缓存(Caching)可以存储经常会用到的信息,这样每次需要的时候,这些信息都是立即可用的. 常用的缓存数据库: Redis   使用内存存储(in-memory)的非关系数据库,字符串.列表.集合.散列表.有序集合,每种数据类型都有自己的专属命令.另外还有批量操作(bulk operation)和不完全(partial)的事务支持 .发布与订阅.主从复制(master/slave replication).持久化.脚本(存储过程,stored procedure). 效率比ehcac

redis从入门到踩坑

背景 Redis在互联网项目的使用也是非常普遍的,作为最常用的NO-SQL数据库,对Redis的了解已经成为了后端开发的必备技能.小编对Redis的使用时间不长,但是项目中确两次踩中了Redis的坑,今天特意从基础知识层面到实战层面对Redis知识进行梳理,能够达到对Redis的知识体系有更全面和深入的理解. Redis的特点 优点: Key-Value类型的内存数据库,是加强版的Memcached. 整个数据库都是在内存中进行操作的,并且定期异步持久化数据到硬盘上进行保存. 在内存中进行操作,