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;
    }
}
發佈了207 篇原創文章 · 獲贊 67 · 訪問量 40萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章