首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android:手把手带你分析 Protocol Buffer使用 源码

对于数据结构对象 对于面向对象的语言(如Java):对象 = Object = 类的实例化;Java中最接近数据结构 即 POJO(Plain Old Java Object),或Javabean(...若optional 或 repeated 字段没有被设置字段值,那么该字段序列化时的数据是完全不存在的,即不进行序列化(少编码一个字段);解码时,相应的字段才会被设置为默认值 根据 字段标识号...值解析出来的标识号,通过case分支读取对应字段类型的数据并通过反编码对字段进行解析 & 赋值 // 字段越多,case分支越多 switch (tag)...字段没有被设置字段值,那么该字段序列化时的数据是完全不存在的,即不进行序列化(少编码一个字段);解码时,相应的字段才会被设置为默认值 根据 字段标识号&数据类型 将 字段值 通过不同的编码方式进行编码...对比于XML 的序列化 & 反序列化过程 XML的反序列化过程如下: 文件读取出字符串 将字符串转换为 XML 文档对象结构模型 XML 文档对象结构模型读取指定节点的字符串 将该字符串转换成指定类型的变量

1.8K10
您找到你想要的搜索结果了吗?
是的
没有找到

Carson带你学序列化:手把手带你分析 Protocol Buffer使用源码

对于数据结构对象 对于面向对象的语言(如Java):对象 = Object = 类的实例化;Java中最接近数据结构 即 POJO(Plain Old Java Object),或Javabean...若optional 或 repeated 字段没有被设置字段值,那么该字段序列化时的数据是完全不存在的,即不进行序列化(少编码一个字段);解码时,相应的字段才会被设置为默认值 根据 字段标识号...值解析出来的标识号,通过case分支读取对应字段类型的数据并通过反编码对字段进行解析 & 赋值 // 字段越多,case分支越多 switch (tag)...字段没有被设置字段值,那么该字段序列化时的数据是完全不存在的,即不进行序列化(少编码一个字段);解码时,相应的字段才会被设置为默认值 根据 字段标识号&数据类型 将 字段值 通过不同的编码方式进行编码...对比于XML 的序列化 & 反序列化过程 XML的反序列化过程如下: 文件读取出字符串 将字符串转换为 XML 文档对象结构模型 XML 文档对象结构模型读取指定节点的字符串 将该字符串转换成指定类型的变量

1.5K40

Google protocol buffer简介

语法 可选字段与缺省值 消息解析时,如果发现消息没有包含可选字段,此时会将消息解析对象相对应的字段设置为默认值,可以通过下面的语法为optional字段设置默认值。...::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream...我们平时的使用,通常一个message对应一个类,在对应的类定义一个setcreate方法来生成和解析PB信息。...Protobuf,数据类型是进行了划分的,其中wire_type主要是以下几种类型: Varint是一种比较特殊的编码方式,后面会再介绍。 FixedXXX是固定长度的数字类型。...通过查看protobuf源代码的你会发现:头文件的定义,会发现针对不同类型的数据类型,都有对应的writeXXX方法。

1.6K60

nio与netty编程(二)

NioEventLoop 内部采用串行化设计,消息的读取->解码->处理->编码->发送,始终由 IO 线程 NioEventLoop 负责。...ChannelFuture 表示 Channel 异步 I/O 操作的结果, Netty 中所有的 I/O 操作都是异步的,I/O 的调用会直接返回,调用者并不能立刻获得结果,但是可以通过 ChannelFuture... Netty 服务器端编程,我们一般都需要提供两个 EventLoopGroup,例如:BossEventLoopGroup WorkerEventLoopGroup。...> shutdownGracefully(),断开连接,关闭线程 ServerBootstrap Bootstrap ServerBootstrap 是 Netty 的服务器端启动助手,通过它可以完成服务器端的各种配置...例如 C++、C#、Java、python 等) 高性能,高可靠性 使用 protobuf 编译器能自动生成代码,Protobuf 是将类的定义使用.proto 文件进行描述, 然后通过 protoc.exe

39910

protobuf源码探秘】编码、序列化

我学protobuf的时候,在网上看到一个博客,说的挺好,但是偏偏插了这么一句:fixed int 相比,fixed重时间、int重空间。...接着继续读取下一个字段 field… Varints 编码 1、每个字节开头的 bit 设置了 msb(most significant bit ),标识是否需要继续读取下一个字节 2、存储数字对应的二进制补码...通过 Varints 我们可以让小的数字用更少的字节表示。从而提高了空间利用效率。...只是代码层面, .proto 文件早就在 protoc 的时候就已经以某种形式存在于 protobuf 生成的客户端代码,代码可以随时拿到 .proto 文件中表达的元信息,例如一个字段是否为嵌套字段...WriteTagToArray:将 Tag 值写入到之前开辟的内存 WriteStringWithSizeToArray:将 Length + Value 值写入到之前开辟的内存

50220

Protocol Buffers(2):编码与解码

通过它将cch文件的数据成员与当前的key-value对应起来。...可以看到,生成的example.pb.cc决定了遇到哪个tag调用哪个解析函数,输入流解析出值,赋给对应的成员变量,而真正进行解析的代码实际上是Protobuf的源码,如下所示: // in wire_format_lit.cc...Protobuf,taglength都是使用varint编码的。...Protobuf的整数浮点数 Protobuf整数也是通过varint进行编码,移除每个字节的MSB,然后拼接在一起,可以得到一个含有数个字节的buffer,这个buffer该怎么解释还需要参考具体的数据类型...对这种packed repeated fields,Protobuf中会以RepeatedField对象承载,支持get-by-index、set-by-indexadd(添加元素)操作。

1.7K30

caffe源码学习之Proto数据格式【1】

: syntax = "proto2"; package caffe; //caffe.prto的各个结构封装在caffe包,可以通过using namespace caffe; 或者caffe:...当我们在编译完成caffe之后,会自动src/caffe/proto中生成两个文件caffe.pb.h caffe.pb.cc 那么这种数据格式程序是如何被使用的呢? ...部分Solver部分的参数,关于BlobLayer,Net还有Solver这四个部分的关系:  blob作为贯穿整个框架的数据单元,Sovler通过sovler.prototxt【我觉得我可能需要说明一下...:.proto.prototxt的区别吧,这两个都是google protobuff的文件,.proto用来定义结构体参数,.prototxt用来相应的.proto的结构体的初始化数据】配置初始化Net...,然后Net通过调用trainval.prototxt这些参数,来调用对应的Layer,并将数据blob输入到相应的Layer,Layer来对流入的数据进行计算处理,然后再将计算后的blob数据返回,

1.8K80

程序员的21大Netty面试问题及答案

TCP粘包/分包的原因: 应用程序写入的字节大小大于套接发送缓冲区的大小,会发生拆包现象,而应用程序写入数据小于套接缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包现象; 进行...适用场景:Hadoop做Hive、PigMapReduce的持久化数据格式。...Protobuf,将数据结构以.proto文件进行描述,通过代码生成工具可以生成对应数据结构的POJO对象Protobuf相关的方法属性。...因为旧版本程序无法读取写入新增的required限定符的字段。 编译器为每一个消息类型生成了一个.java文件,以及一个特殊的Builder类(该类是用来创建消息类接口的)。...Nio模型,bossThread照顾所有有界套接(监听套接),workerThread照顾Accepted- socket(包括IO调用messageMethod等接收事件的方法)。

20510

Protocol Buffer Basics: C#

我们通过一个非常简单的"地址薄"程序来讲解,这个程序可以把人们的联系方式读取写入一个文件。每个人的地址包含一个name, ID,email,一个联系电话phone.    ...message为每个字段指定名称类型。...我们的示例, csharp_namespace 选项已经被重新指新值,所以生成的代码使用命名空间 Google.Protobuf.Examples.AddressBook而不是 Tutorial。   ...然而,一般情况下你可以使用扩展方法之一来写入到一个常规的 System.IO.Stream或者把message转换成二进制数组或者 ByteString.这些扩展信息 Google.Protobuf.MessageExtensions...新代码也会透明的读取旧的消息。     反射     消息描述(文件的内容信息)消息的实例可使用反射api进行检验。对于编写不同文本格式的的代码或智能比较工具是非常有用的。

1.7K90

搞定Protocol Buffers (下)- 原来你是这样的pb

编译器编译主要是利用protoc命令来将你书写的proto代码编译为指定语言的数据访问类,从而对Protobuf数据进行序列化反序列化。运行时部分主要是将要传输的数据进行序列化反序列化的过程。...首先,每个字节删除msb,因为这个是用来告诉我们是否已到达数字的末尾。...消息的二进制版本仅使用字段的编号作为关键,每个字段的名称和声明的类型只能在解码端通过引用消息类型定义(即.proto文件)来确定。 对消息进行编码时,键值被串联到一个字节流。...但解析器会根据实际情况进行处理。对于数字类型字符串类型,如果同一段出现多次,解析器将接受它看到的最后一个值。...这允许以向前向后兼容的方式将[packed = true]添加到现有字段。 字段顺序 字段编号可以.proto文件以任何顺序使用。顺序的选择对消息的序列化方式没有影响。

97210

Google Protocol Buffer 的使用原理

Writer 负责将一些结构化的数据写入一个磁盘文件,Reader 则负责该磁盘文件读取结构化数据并打印到屏幕上。...诸如对消息的成员进行赋值,将消息序列化等等都有相应的方法。 编写 writer Reader 如前所述,Writer 将把一个结构化数据写入磁盘,以便其他人来读取。...现在, Writer 代码,将要存入磁盘的结构化数据由一个 lm::helloworld 类的对象表示,它提供了一系列的 get/set 函数用来修改读取结构化数据的数据成员,或者叫 field...此后,ListMsg 采用 get 方法读取消息的内部信息,并进行打印输出操作。...你甚至可以无需重新部署程序的情况下更新数据结构。只需使用 Protobuf 对数据结构进行一次描述,即可利用各种不同语言或各种不同数据流对你的结构化数据轻松读写。

1.9K30

程序员必备课程——网络编程入门

java TCP socket编程 客户端:java.net.Socket 服务端:java.net.ServerSocket 此类实现客户端套接(也可以就叫“套接”)。...套接是两台机器间通信的端点。套接的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接实现的套接工厂可以配置它自身,以创建适合本地防火墙的套接。...传输数据的格式 上面我们介绍了javaTCPUDP的socket编程,其中UDP有明确的传输数据类DatagramPacket,该类对数据包的各种属性都做了封装,尤其是它对传输内容的边界长度进行了定义...Protobuf介绍 Protobuf全成Google Protocol buffers,他将数据结构以.proto文件进行描述,通过代码生成工具可以生成对应数据结构的POJO对象Protobuf相关的方法属性...java中所有的代码自动生成,包括像ORM框架mybatis自动生成PO代码等,都是通过IO创建类文件,批量写入映射字段的方式。

1.2K60

.NET 8.0 与硬件设备能碰撞出怎么样的火花

1、框架选择 作为一名.Net开发,我肯定是想用.net进行开发的,理由是这个键盘用在PC上,用.Net实现SDK对接WPF,MAUIWinUI可以做很多的任务型的功能。...2、设备通讯协议 键盘采用的固件是开源的ZMK这个代码编写的,设备电脑识别为hid设备,通讯格式使用的Protobuf协议,所以针对.Net也需要使用这个Protobuf进行数据的打包,这个地方花了我一些时间...HidApi.Net还可以,其他的什么Device.Net,HidLibrary都不是很满意,我测试以后选择了HidApi.Net设备通讯,Google.ProtobufGrpc.Tools加工通讯数据...,第一节是数字1,这个是固定的,第二节是数据长度,后面的是数据内容。...数据传输测试 sdk编写测试完成之后,就可以进行sdk的使用了,我使用控制台项目进行测试,包含图片的合成和文字的绘制,以及将绘制好的图片转成设备能够使用的byte数据。

13310

IM通讯协议专题学习(一):Protobuf入门到精通,一篇就够!

Writer 负责将一些结构化的数据写入一个磁盘文件,Reader 则负责该磁盘文件读取结构化数据并打印到屏幕上。...4.5 编写 writer Reader如前所述,Writer 将把一个结构化数据写入磁盘,以便其他人来读取。假如我们不使用 Protobuf,其实也有许多的选择。...现在, Writer 代码,将要存入磁盘的结构化数据由一个 lm::helloworld 类的对象表示,它提供了一系列的 get/set 函数用来修改读取结构化数据的数据成员,或者叫 field...此后,ListMsg 采用 get 方法读取消息的内部信息,并进行打印输出操作。...你甚至可以无需重新部署程序的情况下更新数据结构。只需使用 Protobuf 对数据结构进行一次描述,即可利用各种不同语言或各种不同数据流对你的结构化数据轻松读写。

1.1K10

2021最新版BAT大厂Netty面试题集(有详尽答案)

NIO 的组成 Buffer:与 Channel 进行交互,数据是 Channel 读入缓冲区,从缓冲区写入 Channel 的 flip方法 : 反转此缓冲区,将position给limit,然后将...fdToKey 总是串行读取的,而读取 select 方法中进行 的,该方法是非线程安全的。...TCP 粘包/分包的原因: 应用程序写入的字节大小大于套接发送缓冲区的大小,会发生拆包现象,而应用程序写 入数据小于套接缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘 包现象;...Protobuf,将数据结构以.proto 文件进行描述,通过代码生成工具可以生成对应数据结构的 POJO 对象 Protobuf 相关的方法属性。...ByteBuf 的特点:支持自动扩容(4M),保证 put 方法不会抛出异常、通过内置的复合缓冲 类型,实现零拷贝(zero-copy);不需要调用 flip()来切换读/写模式,读取写入索引分 开;

59720

2021最新版BAT大厂Netty面试题集(有详尽答案)

NIO 的组成 Buffer:与 Channel 进行交互,数据是 Channel 读入缓冲区,从缓冲区写入 Channel 的 flip方法 : 反转此缓冲区,将position给limit,然后将...fdToKey 总是串行读取的,而读取 select 方法中进行 的,该方法是非线程安全的。...TCP 粘包/分包的原因: 应用程序写入的字节大小大于套接发送缓冲区的大小,会发生拆包现象,而应用程序写 入数据小于套接缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘 包现象;...Protobuf,将数据结构以.proto 文件进行描述,通过代码生成工具可以生成对应数据结构的 POJO 对象 Protobuf 相关的方法属性。...ByteBuf 的特点:支持自动扩容(4M),保证 put 方法不会抛出异常、通过内置的复合缓冲 类型,实现零拷贝(zero-copy);不需要调用 flip()来切换读/写模式,读取写入索引分 开;

86720
领券