本文摘自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.set(keys, "zy" );
String value = jedis.get(keys);
System.out.println(value);
Person p= new Person();
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是否可以保存对象的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
linux如何连接Redis
Redis数据量过大怎么办
centos7.6安装mysql和Redis的教程
Redis支持回滚吗
介绍Redis三种集群模式(cluster集群模式)
关于Redis事务和pipleline
Redis的配置文件介绍
Redis中keys的通用操作(代码)
Redis用户验证设置方法
Redis节点是什么
更多相关阅读请进入《Redis》频道 >>
机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » redis是否可以保存对象