Golang中将结构序列化和反序列化为字符串的最佳方法(完整性和性能)是什么,反之亦然?
例如,如果我有这个结构:
struct Session { Properties map[string]interface{} Permissions []int64 }
我想将其存储在Redis上并取回。我试过保存,整型和字符串,这很好,但是如何存储结构对象?
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`))
使用gob和base64可以解决问题,例如:
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 }
当您需要序列化自定义结构或类型(例如Sessionstruct)时,只需添加以下行:
Session
func init() { gob.Register(SX{}) gob.Register(Session{}) }