几乎都可以映射到C++\Java等语言的基础数据类型. protobuf 数据类型 描述 打包 C++语言映射 bool 布尔类型 1字节 bool double 64位浮点数 N double float...的class, 在同一个module里, 定义了两个类, PBPlayer 和 PBResource, 各自拥有一些成员变量. 1 option java_package = "com.proto";...263 } 264 public static com.proto.PlayerModule.PBPlayer parseFrom( 265 com.google.protobuf.CodedInputStream...268 } 269 public static com.proto.PlayerModule.PBPlayer parseFrom( 270 com.google.protobuf.CodedInputStream...相对于Java这种数据类型固定长度的序列化(int 4字节, long 8字节), PB提供了可伸缩性的数据类型(int 1-5字节).
对于数据结构和对象 对于面向对象的语言(如Java):对象 = Object = 类的实例化;在Java中最接近数据结构 即 POJO(Plain Old Java Object),或Javabean(...若optional 或 repeated 字段没有被设置字段值,那么该字段在序列化时的数据中是完全不存在的,即不进行序列化(少编码一个字段);在解码时,相应的字段才会被设置为默认值 根据 字段标识号...值解析出来的标识号,通过case分支读取对应字段类型的数据并通过反编码对字段进行解析 & 赋值 // 字段越多,case分支越多 switch (tag)...字段没有被设置字段值,那么该字段在序列化时的数据中是完全不存在的,即不进行序列化(少编码一个字段);在解码时,相应的字段才会被设置为默认值 根据 字段标识号&数据类型 将 字段值 通过不同的编码方式进行编码...对比于XML 的序列化 & 反序列化过程 XML的反序列化过程如下: 从文件中读取出字符串 将字符串转换为 XML 文档对象结构模型 从 XML 文档对象结构模型中读取指定节点的字符串 将该字符串转换成指定类型的变量
对于数据结构和对象 对于面向对象的语言(如Java):对象 = Object = 类的实例化;在Java中最接近数据结构 即 POJO(Plain Old Java Object),或Javabean...若optional 或 repeated 字段没有被设置字段值,那么该字段在序列化时的数据中是完全不存在的,即不进行序列化(少编码一个字段);在解码时,相应的字段才会被设置为默认值 根据 字段标识号...值解析出来的标识号,通过case分支读取对应字段类型的数据并通过反编码对字段进行解析 & 赋值 // 字段越多,case分支越多 switch (tag)...字段没有被设置字段值,那么该字段在序列化时的数据中是完全不存在的,即不进行序列化(少编码一个字段);在解码时,相应的字段才会被设置为默认值 根据 字段标识号&数据类型 将 字段值 通过不同的编码方式进行编码...对比于XML 的序列化 & 反序列化过程 XML的反序列化过程如下: 从文件中读取出字符串 将字符串转换为 XML 文档对象结构模型 从 XML 文档对象结构模型中读取指定节点的字符串 将该字符串转换成指定类型的变量
语法 可选字段与缺省值 在消息解析时,如果发现消息中没有包含可选字段,此时会将消息解析对象中相对应的字段设置为默认值,可以通过下面的语法为optional字段设置默认值。...::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream...在我们平时的使用中,通常一个message对应一个类,在对应的类中定义一个set和create方法来生成和解析PB信息。...在Protobuf中,数据类型是进行了划分的,其中wire_type主要是以下几种类型: Varint是一种比较特殊的编码方式,后面会再介绍。 FixedXXX是固定长度的数字类型。...通过查看protobuf源代码的你会发现:头文件中的定义,会发现针对不同类型的数据类型,都有对应的writeXXX方法。
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
有将近10万字~,所以建议各位下载源码学习。(如需要请收藏!转载请声明来源,谢谢!)...gRPC gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。...目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go....其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。...注意以下生成后需要手动移到com.hong.spring中否则路劲不一致会报错!(因为这个生成会覆盖所以不能放到一个目录中) 运行以上两个,生成如下: ?
在我学protobuf的时候,在网上看到一个博客,说的挺好,但是偏偏插了这么一句:fixed 和 int 相比,fixed重时间、int重空间。...接着继续读取下一个字段 field… Varints 编码 1、在每个字节开头的 bit 设置了 msb(most significant bit ),标识是否需要继续读取下一个字节 2、存储数字对应的二进制补码...通过 Varints 我们可以让小的数字用更少的字节表示。从而提高了空间利用和效率。...只是在代码层面, .proto 文件早就在 protoc 的时候就已经以某种形式存在于 protobuf 生成的客户端代码中,代码可以随时拿到 .proto 文件中表达的元信息,例如一个字段是否为嵌套字段...WriteTagToArray:将 Tag 值写入到之前开辟的内存中 WriteStringWithSizeToArray:将 Length + Value 值写入到之前开辟的内存中
,通过它将cc和h文件中的数据成员与当前的key-value对应起来。...可以看到,生成的example.pb.cc决定了遇到哪个tag调用哪个解析函数,从输入流中解析出值,赋给对应的成员变量,而真正进行解析的代码实际上是Protobuf的源码,如下所示: // in wire_format_lit.cc...在Protobuf中,tag和length都是使用varint编码的。...Protobuf中的整数和浮点数 Protobuf中整数也是通过varint进行编码,移除每个字节的MSB,然后拼接在一起,可以得到一个含有数个字节的buffer,这个buffer该怎么解释还需要参考具体的数据类型...对这种packed repeated fields,在Protobuf中会以RepeatedField对象承载,支持get-by-index、set-by-index和add(添加元素)操作。
: syntax = "proto2"; package caffe; //caffe.prto中的各个结构封装在caffe包中,可以通过using namespace caffe; 或者caffe:...当我们在编译完成caffe之后,会自动在src/caffe/proto中生成两个文件caffe.pb.h 和caffe.pb.cc 那么这种数据格式在程序中是如何被使用的呢? ...部分和Solver部分的参数,关于Blob和Layer,Net还有Solver这四个部分的关系: blob作为贯穿整个框架的数据单元,Sovler通过sovler.prototxt【我觉得我可能需要说明一下...:.proto和.prototxt的区别吧,这两个都是google protobuff的文件,.proto用来定义结构体参数,.prototxt用来相应的.proto中的结构体的初始化数据】配置初始化Net...,然后Net通过调用trainval.prototxt这些参数,来调用对应的Layer,并将数据blob输入到相应的Layer中,Layer来对流入的数据进行计算处理,然后再将计算后的blob数据返回,
保留字段 如果你对你定义的消息类型进行了更新,例如删除某个字段或者注释掉某个字段,那么其他开发者在以后更新这个消息类型的时候可能会重新使用被你删除/注释掉的字段的数值(tag)。...文件中定义) returns 表示返回值类型(在proto文件中定义) (MsgResponse)表示返回类型(在proto文件中定义) stream 表示一个数据流可加在入参上或者返回值上。...客户端从返回的数据流里一直读取直到没有更多消息为止。...一旦客户端完成消息写入,就等待服务端读取这些消息并返回应答。...在多数语言里,gRPC 编程接口同时支持同步和异步的特点。
TCP粘包/分包的原因: 应用程序写入的字节大小大于套接字发送缓冲区的大小,会发生拆包现象,而应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包现象; 进行...适用场景:在Hadoop中做Hive、Pig和MapReduce的持久化数据格式。...Protobuf,将数据结构以.proto文件进行描述,通过代码生成工具可以生成对应数据结构的POJO对象和Protobuf相关的方法和属性。...因为旧版本程序无法读取或写入新增的required限定符的字段。 编译器为每一个消息类型生成了一个.java文件,以及一个特殊的Builder类(该类是用来创建消息类接口的)。...在Nio模型中,bossThread照顾所有有界套接字(监听套接字),workerThread照顾Accepted- socket(包括IO和调用messageMethod等接收事件的方法)。
我们通过一个非常简单的"地址薄"程序来讲解,这个程序可以把人们的联系方式读取和写入一个文件。每个人的地址包含一个name, ID,email,和一个联系电话phone. ...在message中为每个字段指定名称和类型。...在我们的示例中, csharp_namespace 选项已经被重新指新值,所以生成的代码使用命名空间 Google.Protobuf.Examples.AddressBook而不是 Tutorial。 ...然而,一般情况下你可以使用扩展方法之一来写入到一个常规的 System.IO.Stream或者把message转换成二进制数组或者 ByteString.这些扩展信息在 Google.Protobuf.MessageExtensions...新代码也会透明的读取旧的消息。 反射 消息描述(文件的内容信息)消息的实例可使用反射api进行检验。对于编写不同文本格式的的代码或智能比较工具是非常有用的。
编译器编译主要是利用protoc命令来将你书写的proto代码编译为指定语言的数据访问类,从而对Protobuf数据进行序列化和反序列化。运行时部分主要是将要传输的数据进行序列化和反序列化的过程。...首先,从每个字节中删除msb,因为这个是用来告诉我们是否已到达数字的末尾。...消息的二进制版本仅使用字段的编号作为关键字,每个字段的名称和声明的类型只能在解码端通过引用消息类型定义(即.proto文件)来确定。 对消息进行编码时,键和值被串联到一个字节流中。...但解析器会根据实际情况进行处理。对于数字类型和字符串类型,如果同一字段出现多次,解析器将接受它看到的最后一个值。...这允许以向前和向后兼容的方式将[packed = true]添加到现有字段。 字段顺序 字段编号可以在.proto文件中以任何顺序使用。顺序的选择对消息的序列化方式没有影响。
编码之前,会先进行zigzag编码,上图是其映射关系。...所以聪明的同学们已经知道该如何选择了,对于有符合数尽量选择sint32,而不是int32,不管从空间和时间上,都是更优的选择 3. length-delimi编码 length-delimi编码方式比较简单...先以varint编码写入tag即Key,再以varint编码写入长度,最后把内容memcpy到内存中。...解码是一个递归的过程,先通过Varint解码过程读出Key, 取出field_number字段,如果不存在于message中,就放到UnKnownField中。...对于普通类型(如整形,bytes, fixed类型等)就直接写入Field中,如果是嵌套类型(一般特指嵌套的Message),则递归调用整个解析过程。
1、框架选择 作为一名.Net开发,我肯定是想用.net进行开发的,理由是这个键盘用在PC上,用.Net实现SDK对接WPF,MAUI和WinUI可以做很多的任务型的功能。...2、设备通讯协议 键盘采用的固件是开源的ZMK这个代码编写的,设备在电脑识别为hid设备,通讯格式使用的Protobuf协议,所以针对.Net也需要使用这个Protobuf进行数据的打包,这个地方花了我一些时间...HidApi.Net还可以,其他的什么Device.Net,HidLibrary都不是很满意,在我测试以后选择了HidApi.Net和设备通讯,Google.Protobuf和Grpc.Tools加工通讯数据...,第一字节是数字1,这个是固定的,第二字节是数据长度,后面的是数据内容。...数据传输测试 在sdk编写测试完成之后,就可以进行sdk的使用了,我使用控制台项目进行测试,包含图片的合成和文字的绘制,以及将绘制好的图片转成设备能够使用的byte数据。
Writer 负责将一些结构化的数据写入一个磁盘文件,Reader 则负责从该磁盘文件中读取结构化数据并打印到屏幕上。...诸如对消息的成员进行赋值,将消息序列化等等都有相应的方法。 编写 writer 和 Reader 如前所述,Writer 将把一个结构化数据写入磁盘,以便其他人来读取。...现在,在 Writer 代码中,将要存入磁盘的结构化数据由一个 lm::helloworld 类的对象表示,它提供了一系列的 get/set 函数用来修改和读取结构化数据中的数据成员,或者叫 field...此后,ListMsg 中采用 get 方法读取消息的内部信息,并进行打印输出操作。...你甚至可以在无需重新部署程序的情况下更新数据结构。只需使用 Protobuf 对数据结构进行一次描述,即可利用各种不同语言或从各种不同数据流中对你的结构化数据轻松读写。
java TCP socket编程 客户端:java.net.Socket 服务端:java.net.ServerSocket 此类实现客户端套接字(也可以就叫“套接字”)。...套接字是两台机器间通信的端点。套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。...传输数据的格式 上面我们介绍了java中TCP和UDP的socket编程,其中UDP有明确的传输数据类DatagramPacket,该类对数据包的各种属性都做了封装,尤其是它对传输内容的边界和长度进行了定义...Protobuf介绍 Protobuf全成Google Protocol buffers,他将数据结构以.proto文件进行描述,通过代码生成工具可以生成对应数据结构的POJO对象和Protobuf相关的方法和属性...java中所有的代码自动生成,包括像ORM框架mybatis自动生成PO代码等,都是通过IO创建类文件,批量写入映射字段的方式。
Writer 负责将一些结构化的数据写入一个磁盘文件,Reader 则负责从该磁盘文件中读取结构化数据并打印到屏幕上。...4.5 编写 writer 和 Reader如前所述,Writer 将把一个结构化数据写入磁盘,以便其他人来读取。假如我们不使用 Protobuf,其实也有许多的选择。...现在,在 Writer 代码中,将要存入磁盘的结构化数据由一个 lm::helloworld 类的对象表示,它提供了一系列的 get/set 函数用来修改和读取结构化数据中的数据成员,或者叫 field...此后,ListMsg 中采用 get 方法读取消息的内部信息,并进行打印输出操作。...你甚至可以在无需重新部署程序的情况下更新数据结构。只需使用 Protobuf 对数据结构进行一次描述,即可利用各种不同语言或从各种不同数据流中对你的结构化数据轻松读写。
NIO 的组成 Buffer:与 Channel 进行交互,数据是从 Channel 读入缓冲区,从缓冲区写入 Channel 中的 flip方法 : 反转此缓冲区,将position给limit,然后将...fdToKey 总是串行读取的,而读取是在 select 方法中进行 的,该方法是非线程安全的。...TCP 粘包/分包的原因: 应用程序写入的字节大小大于套接字发送缓冲区的大小,会发生拆包现象,而应用程序写 入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘 包现象;...Protobuf,将数据结构以.proto 文件进行描述,通过代码生成工具可以生成对应数据结构的 POJO 对象和 Protobuf 相关的方法和属性。...ByteBuf 的特点:支持自动扩容(4M),保证 put 方法不会抛出异常、通过内置的复合缓冲 类型,实现零拷贝(zero-copy);不需要调用 flip()来切换读/写模式,读取和写入索引分 开;
领取专属 10元无门槛券
手把手带您无忧上云