dongqing344716
dongqing344716
2015-01-19 07:51

Golang序列化和反序列化

  • serialization
已采纳

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`))
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • duandongjin5647 duandongjin5647 6年前

    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{}) 
    }
    
    点赞 评论 复制链接分享
  • dongnong3799 dongnong3799 6年前

    Serialization of a struct generally uses the encoding package. However, that will work for public fields only. If you also need to serialize private fields, see this answer as an alternative.
    You have several encoding choices (binary, text, json as in this example for a struct, xml, etc.). For example, the project cupcake/rdb uses encoding/binary to implement parsing and encoding of the Redis RDB file format (a binary representation of the in-memory store). Another example is guregu/rediscache, a small library for caching data in Redis.

    点赞 评论 复制链接分享

为你推荐