go语言使用protobuf

网上为什么充斥着大量几乎一模一样而且不正确的教程???

妈的打开一个关于golang和protobuf的教程,无非都是扯他妈的protobuf多么多么牛逼,xml多么多么傻逼,然后就是怎么安装protobuf,然后又是屎一样的示例。

安装过程没一个对的,我搜了那么多博客,全都是一个德行,我先写一下ubuntu的安装步骤,同时适用于mac和其他linux,而且保证是对的。

真的无力吐槽,先说正事,一会接着吐。

一、首先去 https://github.com/google/protobuf 下载protobuf,按照readme的步骤来编译安装。如果执行autogen.sh的过程中出现autoreconf not found的错误,说明没有安装automake,在ubuntu执行sudo apt-get install automake libtool就可以了,其他平台根据实际情况安装。

二、执行 go get -u github.com/golang/protobuf/{proto, proto-gen-go} ,自动安装proto-gen-go

三、把proto-gen-go复制到/usr/local/bin 或者其他路径,只要在包含在PATH环境变量中就可以,为了方便protoc调用它。

四、写一个xx.proto文件,执行protoc --go_out=. xx.proto生成go语言的代码,如果提示libprotoc.so找不到,需要把 /usr/local/lib 添加到LD_LIBRARY_PATH环境变量中。

按照这个步骤搞下来,应该都能编译成功了,使用也很简单,网上大量的屎示例,主要是调用Marshal和Unmarshal来编码和解码。

那么问题来了:

1、我用二进制传输消息意义在哪?

当然就是字节少,传输成本小。

2、妈的二进制不可读啊,怎么解码呢?

调用Unmarshal函数,把对应类型的对象传入,会自动把二进制解码到传入的对象。

3、拿到一大坨二进制数据,怎么知道能解码到哪个类呢?

这个问题问得好,妈的没找到任何地方有人提到这件事,强行忽略然后装作会了吗?在扯他妈的protobuf多么多么牛逼的时候都提到自带反射机制,能够类型推导,到底怎么推导你他妈怎么不说啊???

4、难道只能互相知道要传输的类型,然后才能愉快的用protobuf吗?

知道了类型还用编码干毛啊?直接按照字段顺序硬拼在一起不就行吗?还用protobuf干毛???

总之,网上提到protobuf的,我不知道他们是不是真的用过protobuf,抱谷歌爸爸的大腿赶潮流并没有错,但是强行装出一副深藏功与名的样子是一种好风气吗?

最后,我还是建议,做网游协议,还是自己实现序列化和反序列化吧,无非就是加个类型id而已,这就算原始到令人发指了??

下一步就是开始干。

时间: 2024-10-30 03:56:05

go语言使用protobuf的相关文章

基于Go语言的protobuf 安装 以及简单测试用例

先去官网下载protobuf的源码 https://github.com/google/protobuf/releases 可以先下载本地,然后上传到虚拟机中 我选择的是Source code(tar.gz) 安装依赖包(如果缺少包,可能会报错) yum install -y gcc gcc-c++ autoconf automake libtool curl make g++ unzip 解压后,进入protobuf-3.5.1目录中,运行 ./autogen.sh命令 执行./configu

ProtoBuf开发者指南

目录 1   概览 1.1   什么是protocol buffer 1.2   他们如何工作 1.3   为什么不用XML? 1.4   听起来像是为我的解决方案,如何开始? 1.5   一点历史 2   语言指导 2.1   定义一个消息类型 2.2   值类型 2.3   可选字段与缺省值 2.4   枚举 2.5   使用其他消息类型 2.6   嵌套类型 2.7   更新一个数据类型 2.8   扩展 2.9   包 2.10   定义服务 2.11   选项 2.12   生成你的类

Go语言_RPC_Go语言的RPC

一 标准库的RPC RPC(Remote Procedure Call,远程过程调用)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络细节的应用程序通信协议.简单的说就是要像调用本地函数一样调用服务器的函数. RPC协议构建于TCP或UDP,或者是 HTTP之上,允许开发者直接调用另一台计算机上的程序,而开发者无需额外地为这个调用过程编写网络通信相关代码,使得开发包括网络分布式程序在内的应用程序更加容易. Go语言的标准库已经提供了RPC框架和不同的RPC实现. 下面是一个服务器的

Netty(五)序列化protobuf在netty中的使用

protobuf是google序列化的工具,主要是把数据序列化成二进制的数据来传输用的.它主要优点如下: 1.性能好,效率高: 2.跨语言(java自带的序列化,不能跨语言) protobuf参考文档:Protobuf详解 其实,在netty中使用Protobuf需要注意的是: protobufDecoder仅仅负责编码,并不支持读半包,所以在之前,一定要有读半包的处理器. 有三种方式可以选择: 使用netty提供ProtobufVarint32FrameDecoder 继承netty提供的通用

Protobuf 简介及简单应用

Protobuf 是 protocol buffers 的缩写. 根据官网的说法, protocol buffers 与平台无关, 与语言无关, 实现数据序列化的一种手段. 正如名字一样, protobuf 可以将数据按照规定的协议(protocol)序列化为二进制的数据(buffers). 序列化的数据基本上可以保证类型安全, 并且可以压缩大小. 这篇文章将简单说说关于 protobuf 的优点和问题, 如果有使用的需要可以作为参考 安装和使用 Protobuf 是在 github 上开源的项

71款开源项目

71款开源项目 百度,一家让人既爱又恨的企业,血友吧贴吧被卖,魏则西事件的持续发酵,一时间将百度推到了舆论的风口浪尖上.是非对错,我们在这里也不多做评判,本文呢为大家整理了百度开源的70+项目,看看有没有感兴趣的.本文内容综合整理自oschina.github. 1. JavaScript图表库 ECharts ECharts开源来自百度商业前端数据可视化团队,基于html5 Canvas,是一个纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表.创新的拖拽重计算

Java序列化的几种方式以及序列化的作用

Java序列化的几种方式以及序列化的作用 本文着重讲解一下Java序列化的相关内容. 如果对Java序列化感兴趣的同学可以研究一下. 一.Java序列化的作用    有的时候我们想要把一个Java对象变成字节流的形式传出去,有的时候我们想要从一个字节流中恢复一个Java对象.例如,有的时候我们想要 把一个Java对象写入到硬盘或者传输到网路上面的其它计算机,这时我们就需要自己去通过java把相应的对象写成转换成字节流.对于这种通用 的操作,我们为什么不使用统一的格式呢?没错,这里就出现了java

浅析若干Java序列化工具

??在java中socket传输数据时,数据类型往往比较难选择.可能要考虑带宽.跨语言.版本的兼容等问题.比较常见的做法有: 采用java对象的序列化和反序列化 把对象包装成JSON字符串传输 Google工具protoBuf的开源 本文章所需要的序列化jar包都可以下载:http://download.csdn.net/detail/u013256816/9439971. ??为了便于说明各个做法的区别,分别对这三种做法进行阐述. 对UserVo对象进行序列化,class UserVo如下:

百度最热门31款开源项目:ECharts火爆了!

本文为大家整理了百度开源的热门项目,看看有没有感兴趣的,排名顺序按照 Github ★Star 数排列. 0.一个纯 Java 的图表库 ECharts★Star 19690 ECharts,一个纯 Java 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖轻量级的 Canvas 类库 ZRender,提供直观,生动,可交互,可高度个性化定制的数据可视化图表.ECharts 3 中更是加入了更