前幾天被問到這樣一個問題,redis怎么存對象,平時也沒怎么注意,只知道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下載並獲得文檔)。
接下來看看redis是怎么存對象的
package Object1;
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;
}
}

