Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Golang serialize and deserialize back

What's the best way (completeness and performance) in Golang to serialize and deserialize a struct to string and vice versa?

for example, if I have this struct:

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

I want to store it on Redis and fetch it back. I have tried to save, int and string, it's fine, but how to store struct object?

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`)) 
like image 316
Kokizzu Avatar asked Jan 19 '15 07:01

Kokizzu


1 Answers

Using gob and base64 could solve the problem, for example:

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 } 

and when you need to serialize custom struct or type (for example Session struct), just add these lines:

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

if you want to use other serialization format

like image 72
Kokizzu Avatar answered Sep 22 '22 18:09

Kokizzu