我有一个设置,可以通过网络接收数据并将其序列化到我的结构中。它工作正常,但现在我需要将数据序列化到 slice 缓冲区以通过网络发送它。
我试图避免分配超过需要的空间,所以我已经设置了一个缓冲区,我想为我的所有序列化写入该缓冲区。但我不确定该怎么做。
我的设置是这样的:
recieveBuffer := make([]byte, 1500)
header := recieveBuffer[0:1]
message := recieveBuffer[1:]
因此,我尝试将结构中的字段写入message
,并将所有字段的总字节数作为header
的值。
这就是我反序列化结构的方式:
// Deserialize ...
func (userSession *UserSession) Deserialize(message []byte) {
userSession.UID = int64(binary.LittleEndian.Uint32(message[0:4]))
userSession.UUID = string(message[4:40])
userSession.Username = string(message[40:])
}
然而,我真的不知道如何做相反的事情。是否可以在复制到 message
之前不为每个要序列化的字段创建缓冲区?
最佳答案
给定预分配缓冲区 buf
,您可以像这样反转过程:
buf[0] = byte(40+len(userSession.Username))
binary.LittleEndian.PutUint32(buf[1:], uint32(int32(userSession.UID)))
copy(buf[5:41], userSession.UUID)
copy(buf[41:], userSession.Username)
关于go - 序列化结构字段以预先存在 byte slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47881732/