在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
序列化与反序列化在网络上客户端与服务之间通过数据交换来通信,消息被当作字节序列来传输,它们是没有结构的,仅仅只是一串字节流。 在go语言中有几种方法进行序列化和反序列化操作:
1.自定义协议我们知道在网络中传输都是字节流,那我们如何将一个字节流按不同的数据类型的字节大小进行封装与解封? package pack import ( "bytes" "encoding/binary" "fmt" "sync" ) type Message struct { Msglen uint32 Msgid uint32 Msgdata []byte } //封包函数 func Pack(len uint32,id uint32,data []byte)([]byte,error) { var bufferPool = sync.Pool{ New:func() interface{}{ return new(bytes.Buffer) }, } //获取一个存放bytes的缓冲区,存储字节序列 dataBuff := bufferPool.Get().(*bytes.Buffer) //将数据长度写入字节流 err := binary.Write(dataBuff,binary.LittleEndian,len) checkerr(err) //将id写入字节流 err = binary.Write(dataBuff,binary.LittleEndian,id) checkerr(err) //将数据内容写入字节流 err = binary.Write(dataBuff,binary.LittleEndian,data) checkerr(err) return dataBuff.Bytes(),nil } //解包函数 func Unpack(data []byte)(*Message,error){ //这里可以不需要额外创建一个数据缓冲 //创建一个io。Reader boolBuffer := bytes.NewReader(data) msg := &Message{} //读取数据长度和id err := binary.Read(boolBuffer, binary.LittleEndian, &msg.Msglen) checkerr(err) err = binary.Read(boolBuffer, binary.LittleEndian, &msg.Msgid) checkerr(err) //数据包限制 //if // //} return msg,nil } func checkerr(err error){ if err != nil{ fmt.Println("数据写入与读取失败") } }
2.ASN.1文档:https://www.php.cn/manual/view/35180.html 抽象语法表示法/1(ASN.1)最初出现在 1984 年,它是一个为电信行业设计的复杂标准,Go的标准包 asn1 实现了它的一个子集,它可以将复杂的数据结构序列化成自描述的数据。 func Marshal(val interface{}) ([]byte, os.Error) func Unmarshal(val interface{}, b []byte) (rest []byte, err os 一个简单的示例: /* 使用ASN.1序列化与反序列整型数据的例子*/ package main import( "encoding/asn1" "fmt" "os" ) func main() { mdata, err := asn1.Marshal (13) checkError(err) var n int _ _ , err1 := asn1.Unmarshal(mdata, &) checkError(err1) fmt. Println(("After marshal/unmarshal: ", n) } func checkError(err error) { if err != nil{ fmt. Fprintf(os. Stderr, "Fatal error: %s" , err. Error ()) os. Exit (1) } } ASN.1 支持的数据类型 任何序列化方法都只能处理某些数据类型,而对其他的数据类型无能为力。因此为了评估类似 ASN.1 等序列化方案的可行性,你必须先将要在程序中使用的数据类型与它们支持的数据类型做个比较,下面是 ASN.1 支持的数据类型,可以参考:http://www.obj-sys.com/asn1tutorial/node4.html
3.JSON文档:https://www.php.cn/manual/view/35187.html 4.gob文档:https://www.php.cn/manual/view/35185.html gob 是 Go 中特有的序列化技术。它只能编码 Go 的数据类型,目前它不支持其他语言,反之亦然。它支持除 interface,function,channel 外的所有的 Go 数据类型。它支持任何类型和任何大小的整数,还有字符串和布尔值,结构,数组与切片。 一个典型的用途是传输远程过程调用(RPC)的参数和结果。
|
请发表评论