go 语言的序列化与反序列化
与c 语言一样, 在网络编程中, go语言同样需要进行序列化与反序列化
在c语言中, 通常需要一块内存缓冲区用来收 发数据。缓冲区一般定义成char *buff类型。 当需要发送 数据时, 直接使用memcpy函数 ,将要发送的数据拷贝到buff末尾。 如果发送的数据是一个特定的结构体,首先要进行大小端转换; 如果数据是一段字符串,那么直接拷贝过去就行了
而在go 语言中, socket收发函数的原型如下:
conn.Read(buff []byte)
conn.Write(buff []byte)
其中conn类型为net.Conn
缓冲区是一个[]byte slice 。可以看到读写函数都只要传入缓冲区就行,并没有指定缓冲区长度, 这点跟c语言的socket收发函数不太一样。 主要是由于切片类型中,已经指定了长度, 所以就没有必要再显式指定了
当将网络上的数据读取到缓冲区之后 , 如果解析出我们需要的数据呢? 这时我们就需要用到go 语言的binary包了
binany提供了常用的接口如下
binary.BigEndian.PutUint32([]byte , uint32)
binary.BigEndian.Uint32([]byte)
这两个函数用来直接从[]byte 缓冲区中以大端序读取一个整数
那么如果我们想从缓冲区中直接读取出一个消息的结构体,怎么办呢?
一种办法是使用上述方式一个字段一个字段去读,另一种是一次读取出整个结构体。
首先,用[]byte 生成一个byte.Buffer
newbuff := bytes.NewBuffer([]byte)
然后从newbuff里面读取
binary.Read(newbuff, binary.BigEndian, 数据类型)
写函数
binary.Write(newbuff, binary.BigEndian, 数据类型)
而如果要接着读取[]byte,或者string类型, 可以直接对newbuff操作
比如str := newbuff.ReadString(len)
bytes := newbuff.ReadBytes(len)
并不需要自己再去调整读写的位置
go 语言的序列化与反序列化的更多相关文章
- Go语言的序列化与反序列化(gob)
encoding/gob包实现了高效的序列化,特别是数据结构较复杂的,结构体.数组和切片都被支持. 实现代码如下://定义一个结构体type Student struct { Name string ...
- C#语言-08.序列化与反序列化
a. 序列化:是将对象的状态存储到特定存储介质中的过程 i. 语法:public void Serialize(序列化过程的文件流,保存的对象) b. 返序列化:是从特定存储介质中将数据重新构建对象的 ...
- go语言之行--文件操作、命令行参数、序列化与反序列化详解
一.简介 文件操作对于我们来说也是非常常用的,在python中使用open函数来对文件进行操作,而在go语言中我们使用os.File对文件进行操作. 二.终端读写 操作终端句柄常量 os.Stdin: ...
- C语言JSON序列化/反序列化
最近想找一个C语言处理嵌套结构体和结构体数组的json库,理想的是能够很容易处理复杂结构体嵌套,并且使用简单的,但是没找到比较合适的,于是打算自己封装一个: 两个问题: C语言结构体本身没有元数据,这 ...
- Swift语言精要 - 序列化和反序列化
在swift中你可以把一个对象转换成为数据,你所要做的就是 首先,你需要让对象实现NSObject和NSCoding协议. 其次,实现以下两个方法: encodeWithCoder init(code ...
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)
在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...
- [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化
[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.N ...
- DotNet的JSON序列化与反序列化
JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...
- 在C#中,Json的序列化和反序列化的几种方式总结
在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象. 什么是JSON? JSON (JavaScript Object Notation) ...
随机推荐
- ASP Action函数 如何接收client传递的数据(编辑中。。。)
参看链接:https://www.cnblogs.com/umlzhang/p/3654486.html 我这里总结一下,Action的参数的来源比较多 1.url 2.路由设定 3.post中的内容 ...
- python学习记录20190122_增量赋值
python中的增量赋值 一,在python中a=a+b和a+=b有区别吗 **1,对可变的数据类型 a=[1,2,3]print(id(a)) #1602469350792b=[4,5]a=a+bp ...
- webDriver基本运用
import time from selenium import webdriver import unittest import HTMLTestRunner # webDriver基本应用 cla ...
- swoole 版本查看
php --ri swoole php --ri swoole | grep Version 查看swoole版本 php -m | grep swoole 查看swoole拓展是否安装成功(ph ...
- javascript中new Date()存在的兼容性问题
问题:通过new Date()创建的时间对象在Chrome能正常工作,但在IE浏览器却显示NaN 代码: var time = new Date(date + ' 00:00:00'); //NaN ...
- 学习笔记_J2EE_Spring(一)_入门
3. Spring概述 3.1. Spring是什么 Spring是一个优秀的高可用的JavaEE轻量级开发框架.提供一站式开发解决方案. 3.2. Spring框架出现的背景 在世 ...
- trie字典树:初学
应用: 1.前缀问题 2.异或问题(转化为前缀问题) 3.查询问题 思想: 将要进行匹配的字符串化为一颗树 字符为边,在结束位置统计该串的全部信息 操作:插入,查询,删除.etc ac: #inclu ...
- python+selenium自动测试之WebDriver的常用API(基础篇一)
基于python3.6,selenium3.141,详细资料介绍查看官方API文档,点击这里 一.对浏览器操作 driver = webdriver.Chrome() # 初始化chrome driv ...
- CAS5.3.0安装部署
部署环境:JDK1.8.x maven-3.5.2 tomcat-8.x.x 1.下载地址 https://github.com/apereo/cas-overlay-template/tree/5. ...
- 时分秒计时器 js
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...