首頁  >  文章  >  資料庫  >  redis是否可以保存對象

redis是否可以保存對象

anonymity
anonymity原創
2019-06-04 16:25:012942瀏覽

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下載並取得文件)。

實驗案例:

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是否可以保存對象的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn