转: gob编解码
要让数据对象能在网络上传输或存储,我们需要进行编码和解码。现在比较流行的编码方式有JSON,XML等。然而,Go在gob包中为我们提供了另一种方式,该方式编解码效率高于JSON。gob是Golang包自带的一个数据结构序列化的编码/解码工具
源和目的地值/类型不需要完全对应。在接收变量中,但从发送类型或值丢失的字段将在目标中被忽略。如果在两个字段中都存在同名的字段,则它们的类型必须兼容。接收器和发送器都会做所有必要的间接和迂回,以在实际值和实际值之间转换。
struct { A, B int }
can be sent from or received into any of these Go types:
struct { A, B int } // the same
*struct { A, B int } // extra indirection of the struct
struct { *A, **B int } // extra indirection of the fields
struct { A, B int64 } // different concrete value type; see below
It may also be received into any of these:
struct { A, B int } // the same
struct { B, A int } // ordering doesn't matter; matching is by name
struct { A, B, C int } // extra field (C) ignored
struct { B int } // missing field (A) ignored; data will be dropped
struct { B, C int } // missing field (A) ignored; extra field (C) ignored.
Attempting to receive into these types will draw a decode error:
struct { A int; B uint } // change of signedness for B
struct { A int; B float } // change of type for B
struct { } // no field names in common
struct { C, D int } // no field names in common
例子:
package main
import (
"bytes"
"encoding/gob"
"fmt"
)
type Person struct {
Name string
Age int
Action Run
}
type Run struct {
Speed int
}
func main() {
var dao bytes.Buffer
var encoder = gob.NewEncoder(&dao)
var decoder = gob.NewDecoder(&dao)
p := Person{Name:"chen",Age:18,Action:Run{80}}
err := encoder.Encode(&p)
if err != nil{
panic(err)
}
fmt.Println(dao.String())
var d Person
err = decoder.Decode(&d)
if err != nil{
panic(err)
}
fmt.Println(d)
}
如果Encode/Decode类型是interface或者struct中某些字段是interface{}的时候,需要在gob中注册interface可能的所有实现或者可能类型,不然会报:panic: gob: type not registered for interface: main.Run错误
例子2 编解码的struct中某些字段是interface{}的时候
package main
import (
"encoding/gob"
"fmt"
"bytes"
)
func init() {
gob.Register(&Run{})//必须在encoding/gob编码解码前进行注册
}
//panic: gob: type not registered for interface: main.Run
type Person struct {
Name string
Age int
Action interface{}
}
type Run struct {
Speed int
}
func main() {
var dao bytes.Buffer
encoder := gob.NewEncoder(&dao)
decoder := gob.NewDecoder(&dao)
p := Person{Name:"chen",Age:18,Action:Run{80}}
err := encoder.Encode(&p)
if err != nil{
panic(err)
}
fmt.Println(dao.String())
var d Person
err = decoder.Decode(&d)
if err != nil{
panic(err)
}
fmt.Println(d)
}
例子3 编解码的类型是interface
package main
import (
"fmt"
"bytes"
"encoding/gob"
)
func init() {
gob.Register(&Person{})//必须在encoding/gob编码解码前进行注册
gob.Register(&Dog{})
}
type Actioner interface {
Action()
}
type Person struct {
Name string
}
type Dog struct {
Name string
}
func (p *Person)Action() {
fmt.Println("person action")
}
func (p *Dog)Action() {
fmt.Println("dog action")
}
func main() {
var dao bytes.Buffer
encoder := gob.NewEncoder(&dao)
decoder := gob.NewDecoder(&dao)
var action Actioner
action = &Person{"chen"}
err := encoder.Encode(&action)
if err != nil{
panic(err)
}
action = &Dog{"jok"}
err = encoder.Encode(&action)
if err != nil{
panic(err)
}
err = decoder.Decode(&action)
if err != nil{
panic(err)
}
fmt.Println(action)
action.Action()
err = decoder.Decode(&action)
if err != nil{
panic(err)
}
fmt.Println(action)
action.Action()
}
我们也可以将*bytes.Buffer换成*os.File,将编码后的对象写入磁盘存储
性能测试
下面进行一下简单的性能测试,测试一下gob和json的编解码性能。
gob:
package main
import (
"bytes"
"encoding/gob"
"fmt"
"time"
)
type Person struct {
Name string
Age int
Action Run
}
type Run struct {
Speed int
}
var dao bytes.Buffer
var encoder = gob.NewEncoder(&dao)
var decoder = gob.NewDecoder(&dao)
func Gob() {
p := Person{Name:"chen",Age:18,Action:Run{80}}
err := encoder.Encode(&p)
if err != nil{
panic(err)
}
//fmt.Println(dao.String())
var d Person
err = decoder.Decode(&d)
if err != nil{
panic(err)
}
//fmt.Println(d)
}
func main() {
now := time.Now()
start := now.UnixNano()
for i := 0; i < 10000; i++ {
Gob()
}
now2 := time.Now()
end := now2.UnixNano()
fmt.Println(end - start) //25016400
}
gob编解码循环10000次所需时间为25016400纳秒
json:
package main
import (
"encoding/json"
"fmt"
"time"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Action Run `json:"action"`
}
type Run struct {
Speed int `json:"speed"`
}
func Json() {
p := Person{Name:"chen",Age:18,Action:Run{80}}
data,err := json.Marshal(p)
if err != nil{
panic(err)
}
//fmt.Println(string(data))
var d Person
err = json.Unmarshal(data,&d)
if err != nil{
panic(err)
}
//fmt.Println(d)
}
func main() {
now := time.Now()
start := now.UnixNano()
for i := 0; i < 10000; i++ {
Json()
}
now2 := time.Now()
end := now2.UnixNano()
fmt.Println(end - start) //45037200
}
json编解码循环10000次所需时间为45037200纳秒
总结:粗略的测试gob的性能大概是json的两倍左右
转: gob编解码的更多相关文章
- 各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式
编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放 license收费等 ...
- 集显也能硬件编码:Intel SDK && 各种音视频编解码学习详解
http://blog.sina.com.cn/s/blog_4155bb1d0100soq9.html INTEL MEDIA SDK是INTEL推出的基于其内建显示核心的编解码技术,我们在播放高清 ...
- 我的Android进阶之旅------>Android中编解码学习笔记
编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...
- 【miscellaneous】各种音视频编解码学习详解
编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...
- 【FFMPEG】各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式
目录(?)[-] 编解码学习笔记二codec类型 编解码学习笔记三Mpeg系列Mpeg 1和Mpeg 2 编解码学习笔记四Mpeg系列Mpeg 4 编解码学习笔记五Mpeg系列AAC音频 编解码学习笔 ...
- iOS8系统H264视频硬件编解码说明
公司项目原因,接触了一下视频流H264的编解码知识,之前项目使用的是FFMpeg多媒体库,利用CPU做视频的编码和解码,俗称为软编软解.该方法比较通用,但是占用CPU资源,编解码效率不高.一般系统都会 ...
- IOS和Android支持的音频编解码
1.IOS编码 参考文档地址:https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/Multimedi ...
- java编解码技术,netty nio
对于java提供的对象输入输出流ObjectInputStream与ObjectOutputStream,可以直接把java对象作为可存储 的字节数组写入文件,也可以传输到网络上去.对与java开放人 ...
- 编解码-marshalling
JBoss的Marshalling序列化框架,它是JBoss内部使用的序列化框架,Netty提供了Marshalling编码和解码器,方便用户在Netty中使用Marshalling. JBoss M ...
随机推荐
- 减小VirtualBox虚拟硬盘文件的大小
虚拟机使用久了就会发现虚拟硬盘越来越大,但是进入虚拟机里的系统用命令看了下,实际占用的空间远没有虚拟硬盘大小那么大,这个让人很不爽,而且在分享虚拟机镜像的时候也很不方便.VirtualBox似乎没有提 ...
- hdu 1171 有num1个w1 , num2个w2 ……. (母函数)
输入n,代表学院里面有n种设备,并且在下面输入n行,每一行输入v,m代表设备的价格为v,设备的数量是m.然后要求把这些设备的总价值分摊,尽量平分,使其总价值接近相等,最好是相等 比如样例二(1+X10 ...
- CentOS7.5安装与使用mysql-workbench
1.下载 https://dev.mysql.com/downloads/workbench/ 要选开发版,通用版安装后要么闪退要么起不来 2.安装 rpm -ivh mysql-workbench- ...
- lr自带网站WebTours打不开
- 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 G.路径-带条件的树的直径变形-边权最大,边数偶数的树上的最长路径-树形dp
链接:https://ac.nowcoder.com/acm/contest/558/G 来源:牛客网 路径 小猫在研究树. 小猫在研究路径. 给定一棵N个点的树,每条边有边权,请你求出最长的一条路径 ...
- HDU - 5999 The Third Cup is Free 贪心 简单题
The Third Cup is Free Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- 一文搞定 Mybatis 的应用
Mybatis 介绍 Mybatis 是一个开源的持久层框架,原来叫 ibatis ,它对 jdbc 操作数据库的过程进行了封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动. ...
- python列表中中文编码的问题
在python2列表中,有时候,想打印一个列表,会出现如下显示: 这个是由于: print一个对象,是输出其“为了给人(最终用户)阅读”而设计的输出形式,那么字符串中的转义字符需要转出来,而且 也不要 ...
- DHTML参考手册
中文DHTML参考手册 本dhtml教程由宏博内容管理系统为它的Smarty模板制作者收集的,目的是可以做出更加精美的模板.下面列出了由动态 HTML 定义的对象.DHTML中文参考手册,实用dhtm ...
- 希尔排序之C++实现(高级版)
希尔排序之C++实现(高级版) 一.源代码:ShellSortHigh.cpp /*希尔排序基本思想: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组. 所有距离为d1的倍数的记录放在同 ...