为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 序列化和反序列化回来

Golang 序列化和反序列化回来

Go
qq_花开花谢_0 2021-09-10 21:45:17
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 exampleuser_id, err := redis.Int64(conn.Do(`GET`, `uid_key`))login_email, err := redis.String(conn.Do(`GET`, `email_key`))
查看完整描述

2 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

使用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

}

当您需要序列化自定义结构或类型(例如Session结构)时,只需添加以下几行:


func init() {

    gob.Register(SX{})

    gob.Register(Session{}) 

}


查看完整回答
反对 回复 2021-09-10
?
MM们

TA贡献1886条经验 获得超2个赞

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

查看完整回答
反对 回复 2021-09-10
  • 2 回答
  • 0 关注
  • 248 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信