猿问

Golang 序列化和反序列化回来

Golang 中将结构序列化和反序列化为字符串的最佳方式(完整性和性能)是什么,反之亦然?


例如,如果我有这个结构:


struct Session {

   Properties map[string]interface{}

   Permissions []int64

}

我想将它存储在Redis 上并取回它。我试过保存,int 和 string,没问题,但是如何存储 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`))


qq_花开花谢_0
浏览 249回答 2
2回答

莫回无

使用gob和base64可以解决问题,例如:import (    "encoding/base64"    "encoding/gob"    "bytes")type SX map[string]interface{}// go binary encoderfunc 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 decoderfunc 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}当您需要序列化自定义结构或类型(例如Session结构)时,只需添加以下几行:func init() {    gob.Register(SX{})    gob.Register(Session{}) }

MM们

结构的序列化通常使用encoding包。但是,这仅适用于公共领域。如果您还需要序列化私有字段,请参阅此答案作为替代方案。您有多种编码选择(二进制、文本、json,如本示例中的 struct、 xml 等)。例如,该项目cupcake/rdb用于encoding/binary实现Redis RDB 文件格式(内存存储的二进制表示)的解析和编码。另一个例子是guregu/rediscache,一个用于在 Redis 中缓存数据的小型库。
随时随地看视频慕课网APP

相关分类

Go
我要回答