web-dev-qa-db-fra.com

Golang sérialiser et désérialiser en retour

Quel est le meilleur moyen (exhaustivité et performance) dans Golang pour sérialiser et désérialiser une structure en chaîne et vice versa?

par exemple, si j'ai cette structure:

struct Session {
   Properties map[string]interface{}
   Permissions []int64
}

Je veux le stocker sur Redis et le récupérer. J'ai essayé d'enregistrer, int et string, ça va, mais comment stocker un objet struct?

conn := redisConnectors.Get()

// set example

_, err := conn.Do(`SETEX`, `uid_key`, EXPIRE_SEC, user_id)
_, err = conn.Do(`SETEX`, `email_key`, EXPIRE_SEC, login_email)

// get example

user_id, err := redis.Int64(conn.Do(`GET`, `uid_key`))
login_email, err := redis.String(conn.Do(`GET`, `email_key`))
19
Kokizzu

L'utilisation de gob et base64 pourrait résoudre le problème, par exemple:

import (
    "encoding/base64"
    "encoding/gob"
    "bytes"
)

type SX map[string]interface{}

// go binary encoder
func ToGOB64(m SX) string {
    b := bytes.Buffer{}
    e := gob.NewEncoder(&b)
    err := e.Encode(m)
    if err != nil { fmt.Println(`failed gob Encode`, err) }
    return base64.StdEncoding.EncodeToString(b.Bytes())
}

// go binary decoder
func FromGOB64(str string) SX {
    m := SX{}
    by, err := base64.StdEncoding.DecodeString(str)
    if err != nil { fmt.Println(`failed base64 Decode`, err); }
    b := bytes.Buffer{}
    b.Write(by)
    d := gob.NewDecoder(&b)
    err = d.Decode(&m)
    if err != nil { fmt.Println(`failed gob Decode`, err); }
    return m
}

et lorsque vous devez sérialiser une structure ou un type personnalisé (par exemple Session struct), ajoutez simplement ces lignes:

func init() {
    gob.Register(SX{})
    gob.Register(Session{}) 
}
25
Kokizzu

La sérialisation d'une structure utilise généralement le package encoding . Cependant, cela ne fonctionnera que pour les domaines publics. Si vous devez également sérialiser des champs privés, voir cette réponse comme alternative.
Vous avez plusieurs choix d'encodage (binaire, texte, json comme dans cet exemple pour une structure , xml, etc.). Par exemple, le projet cupcake/rdb utilise encoding/binary pour implémenter l'analyse et l'encodage de Redisformat de fichier RDB (une représentation binaire de la mémoire en mémoire). Un autre exemple est guregu/rediscache , une petite bibliothèque pour la mise en cache des données dans Redis.

9
VonC