学习go语言内置的gob编码——编码后的数据长度

15 篇文章 0 订阅

go语言内置了gob这种编码方案,我从来没用过,感觉很好奇,今天试试。

先写一个简单的代码体验一下:
 

type Retangle struct {
	Length uint8
	Width  uint8
}


func main() {

	r := Retangle{
		20,
		18,
	}

	var buffer bytes.Buffer

	encoder := gob.NewEncoder(&buffer)
	err := encoder.Encode(&r)
	if err != nil {
		fmt.Printf("encode err:%v", err)
		return
	}

	data := buffer.Bytes()
	fmt.Printf("编码后的数据: %x,数据长度:%d\n", data, len(data))
	//传输.......


	var otherR Retangle
	decoder := gob.NewDecoder(bytes.NewReader(data))
	err = decoder.Decode(&otherR)
	if err != nil {
		fmt.Printf("decode err:%v", err)
		return
	}

	fmt.Printf("解码数据: %v\n", otherR)
}

运行结果如下:

编码后的数据: 2bff8103010108526574616e676c6501ff8200010201064c656e67746801060001055769647468010600000007ff820114011200,数据长度:52
解码数据: {20 18}

看到这里,我心里只想说一句WTF。

一个2字节长的结构体被编码成52字节长的数据,想吐血。

暂时忍一下,看看长一点的数据效果会不会有改善,我把编解码的数据类型由结构体改成结构体slice类型。代码如下:
 

type Retangle struct {
	Length uint8
	Width  uint8
}


func main() {

	r := Retangle{
		20,
		18,
	}

	var rects []Retangle

	for i:=0; i<100;i++ {
		rects = append(rects, r)
	}

	var buffer bytes.Buffer

	encoder := gob.NewEncoder(&buffer)
	err := encoder.Encode(&rects)
	if err != nil {
		fmt.Printf("encode err:%v", err)
		return
	}

	data := buffer.Bytes()
	fmt.Printf("编码后的数据: %x,数据长度:%d\n", data, len(data))
	//传输.......


	var otherRs []Retangle
	decoder := gob.NewDecoder(bytes.NewReader(data))
	err = decoder.Decode(&otherRs)
	if err != nil {
		fmt.Printf("decode err:%v", err)
		return
	}

	fmt.Printf("解码数据: %v\n", otherRs)
}

运行的效果是,编码后的数据长度达到:565字节。晕死,200字节长的数据编码后变成565字节了,这膨胀得有点严重啊。

接着我把要编码的slice长度提升到1000,运行效果是编码后的数据长度达到5067。

最后再把要编码的slice长度提升到10000,运行效果是编码后的数据长度达到50067。

看来很稳定啊,膨胀到2.5倍啊。内心真是有句MMP不知道当讲不当讲。

(全文完)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值