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下載并獲得文檔)。
實驗案例:
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; ????} }