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`))
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With