Maison  >  Article  >  base de données  >  Redis peut-il sauvegarder des objets ?

Redis peut-il sauvegarder des objets ?

anonymity
anonymityoriginal
2019-06-04 16:25:012962parcourir

Redis peut stocker des objets, mais la sérialisation et la désérialisation sont requises.

Redis peut-il sauvegarder des objets ?

Pourquoi implémenter l'interface de sérialisation ?

Lorsqu'une classe implémente l'interface Serialisable (cette interface n'est qu'une interface de marque et ne contient aucune définition de méthode), cela signifie que la classe peut être sérialisée. Le but de la sérialisation est de convertir un. classe qui implémente l'interface Serialisable dans un L'objet peut être converti en une séquence d'octets. Enregistrez la séquence d'octets (par exemple, dans un fichier) et vous pourrez restaurer la séquence d'octets dans l'objet d'origine à tout moment ultérieurement. La séquence d'octets peut même être placée sur d'autres ordinateurs ou transmise à d'autres ordinateurs via le réseau pour être récupérée. Tant que la classe correspondante existe sur la plate-forme informatique, elle peut être restaurée normalement dans l'objet d'origine. Implémentation : pour sérialiser un objet, vous devez d'abord créer des objets OutputStream, puis les encapsuler dans un objet ObjectOutputStream, puis appeler la méthode writeObject() pour sérialiser un objet ;

Remarque : lors de l'utilisation d'un flux d'objets pour écrire dans un fichier, non seulement l'objet doit être sérialisé, mais les objets membres de l'objet doivent également être sérialisés

À propos de la classe du Serialisable interface serialVersionUID :

serialVersionUID est de type long. Il existe deux méthodes de génération dans Eclipse :

La valeur par défaut est 1L :

private static final long serialVersionUID = 1L ;

L'autre est basée sur le nom de la classe et l'interface. name , les méthodes et attributs des membres, etc. génèrent un champ de hachage de 64 bits :

private static final long serialVersionUID = 3969438177161438988L;

serialVersionUID sert principalement à résoudre le problème de compatibilité de la désérialisation des objets.

Si SerialVersionUID n'est pas fourni, une fois l'objet sérialisé et stocké sur le disque dur, le champ de la classe sera augmenté ou diminué. De cette façon, une exception se produira lors de la désérialisation, provoquant des problèmes d'incompatibilité.

Mais lorsque le serialVersionUID est le même, il désérialisera différents champs avec la valeur par défaut de type. De cette façon, vous pouvez éviter les problèmes d’incompatibilité.

La méthode ci-dessus ne peut être restaurée que vers des objets Java. Si vous souhaitez restaurer vers d'autres objets (tels que des objets C++), vous devez convertir les objets Java au format XML, afin qu'ils puissent être utilisés par divers. plates-formes et diverses utilisations linguistiques. Vous pouvez utiliser les bibliothèques de classes javax.xam.* distribuées avec le JDK, ou utiliser la bibliothèque de classes open source XOM (peut être téléchargée et documentée depuis www.xom.nu).

Cas expérimental :

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;
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn