redis是否可以保存对象


本文摘自PHP中文网,作者anonymity,侵删。

redis是可以存储对象的,但是需要用到序列化和反序列化。

为什么要实现序列化接口?

当一个类实现了Serializable接口(该接口仅为标记接口,不包含任何方法定义),表示该类可以序列化.序列化的目的是将一个实现了Serializable接口的对象转换成一个字节序列,可以。 把该字节序列保存起来(例如:保存在一个文件里),以后可以随时将该字节序列恢复为原来的对象。甚至可以将该字节序列放到其他计算机上或者通过网络传输到其他计算机上恢复,只要该计 算机平台存在相应的类就可以正常恢复为原来的对象。 实现:要序列化一个对象,先要创建某些OutputStream对象,然后将其封装在一个ObjectOutputStream对象内,再调用writeObject()方法即可序列化一个对象;反序列化也类似。

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

关于Serializable接口的类中的serialVersionUID:

serialVersionUID是long类型的。在Eclipse中有两种生成方式:

默认的是1L:

private static final long serialVersionUID = 1L;

另外一个则是根据类名、接口名、成员方法以及属性等生成一个64位的哈希字段:

private static final long serialVersionUID = 3969438177161438988L;

serialVersionUID主要是为了解决对象反序列化的兼容性问题。

如果没有提供serialVersionUID,对象序列化后存到硬盘上之后,再增加或减少类的filed。这样,当反序列化时,就会出现Exception,造成不兼容问题。

但当serialVersionUID相同时,它就会将不一样的field以type的缺省值反序列化。这样就可以避开不兼容问题了。

以上方式只能恢复成Java对象,如果想要恢复成其他对象(如C++对象),那就要将Java对象转换为XML格式,这样可以使其被各种平台和各种语言使用。可以使用随JDK一起发布的javax.xam.*类库,或者使用开源XOM类库(可以从www.xom.nu下载并获得文档)。

实验案例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import bean.Person;

import redis.clients.jedis.Jedis;

public class SerializeUtil {

    public static void main(String [] args){

        Jedis jedis = new Jedis("172.16.135.2");

        String keys = "name";

        // 删数据

        //jedis.del(keys);

        // 存数据

        jedis.set(keys, "zy");

        // 取数据

        String value = jedis.get(keys);

        System.out.println(value);

         

        //存对象

        Person p=new Person();  //peson类记得实现序列化接口 Serializable

        p.setAge(20);

        p.setName("姚波");

        p.setId(1);

        jedis.set("person".getBytes(), serialize(p));

        byte[] byt=jedis.get("person".getBytes());

        Object obj=unserizlize(byt);

        if(obj instanceof Person){

            System.out.println(obj);

        }

    }

     

    //序列化

    public static byte [] serialize(Object obj){

        ObjectOutputStream obi=null;

        ByteArrayOutputStream bai=null;

        try {

            bai=new ByteArrayOutputStream();

            obi=new ObjectOutputStream(bai);

            obi.writeObject(obj);

            byte[] byt=bai.toByteArray();

            return byt;

        } catch (IOException e) {

            e.printStackTrace();

        }

        return null;

    }

     

    //反序列化

    public static Object unserizlize(byte[] byt){

        ObjectInputStream oii=null;

        ByteArrayInputStream bis=null;

        bis=new ByteArrayInputStream(byt);

        try {

            oii=new ObjectInputStream(bis);

            Object obj=oii.readObject();

            return obj;

        } catch (Exception e) {

             

            e.printStackTrace();

        }

     

         

        return null;

    }

}

以上就是redis是否可以保存对象的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

怎么理解Redis

Redis中zset怎么使用

Redis怎么做集群

Redis怎么下载

Redis除了做缓存还可以做什么

Redis有序集合的相关命令有哪些

Redis性能监控指标总结

linux怎么安装Redis

如何解决Redis连接超时问题

Redis怎么清理缓存

更多相关阅读请进入《Redis》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...