protobuf 序列化 使用
protocol buff是一种协议,是谷歌推出的一种序列化协议 .Java序列化协议也是一种协议
两者的目的是,将对象序列化成字节数组,或者说是二进制数据
导包
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.5.1</version>
</dependency>
创建 demo.proto 文件
option java_package = "com.proto";
option java_outer_classname = "PlayerModule"; message PBPlayer{
required int64 playerId = 1; required int32 age = 2; required string name = 3; repeated int32 skills = 4;
} message PBResource{
required int64 gold = 1; required int32 energy = 2;
}
由工具protoc.exe 使用 bat命令 生成 Java文件
protoc ./proto/*.proto --java_out=./src pause
对象序列化
//获取一个构造器
Builder builder = PlayerModule.PBPlayer.newBuilder();
//设置数据
builder.setPlayerId(101).setAge(20).addSkills(1011);
//构造出对象
PBPlayer player = builder.build();
//序列化成字节数组
return player.toByteArray();
toByteArray -> writeTo(生成的类自己实现的)
反序列化
PBPlayer pbPlayer = PlayerModule.PBPlayer.parseFrom(byte);
自定义序列化
将一个int数据序列化
4个字节 字节序,简单来说,就是指的超过一个字节的数据类型在内存中存储的顺序
可采用两种方式序列化啊
大端字节序:
高位字节数据存放在低地址处,低位数据存放在高地址处;
小段字节序:
高位字节数据存放在高地址处,低位数据存放在低地址处;
TCP/IP协议传输数据时,字节序默认大端。

public static byte[] int2bytes(int i) {
byte[] bytes = new byte[4];
bytes[0] = (byte)(i >> 3*8); //
bytes[1] = (byte)(i >> 2*8); //
bytes[2] = (byte)(i >> 1*8); //
bytes[3] = (byte)(i >> 0*8); //00i
return bytes;
}
public static int byte2int(byte[] bytes) {
return (bytes[0] << 3*8) |
(bytes[0] << 2*8) |
(bytes[0] << 1*8) |
(bytes[0] << 0*8);
}
也可以使用NIO的ByteBuffer
ByteBuffer buffer = ByteBuffer.allocate(8); buffer.putInt(id);
buffer.putInt(age); ByteBuffer buffer2 = ByteBuffer.wrap(buffer.array());
buffer2.getInt()
protobuf 序列化 使用的更多相关文章
- 透过byte数组简单分析Java序列化、Kryo、ProtoBuf序列化
序列化在高性能网络编程.分布式系统开发中是举足轻重的之前有用过Java序列化.ProtocolBuffer等,在这篇文章这里中简单分析序列化后的byte数组观察各种序列化的差异与性能,这里主要分析Ja ...
- python protobuf序列化repeated运用
下面是proto描述文件的定义 message Person { required string name = 1; required int32 id = 2; optional string em ...
- google protobuf序列化原理解析 (PHP示例)
一.简介 Protocol Buffers是谷歌定义的一种跨语言.跨平台.可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据量小, ...
- 常见的序列化框架及Protobuf序列化原理
原文链接:https://www.jianshu.com/p/657fbf347934 https://www.cnblogs.com/javazhiyin/p/11375553.html https ...
- protobuf序列化、反序列化
引用dllprotobuf-net.rar /// <summary> /// buf序列化 /// </summary> public static String Seria ...
- Java数据通讯中使用Googgle Protobuf 序列化与反序列化
概念 1.什么是protocol buffer ProtocolBuffer是用于结构化数据串行化的灵活.高效.自动的方法,有如XML,不过它更小.更快.也更简单.你可以定义自己的数据结构,然后使用代 ...
- ProtoBuf序列化和反序列化方法
最近公司需要将以前的协议全都改成ProtoBuf生成的协议,再将结构体打包和解包过程终于到一些问题 ,无法使用Marshal.SizeOf计算结构体大小,最后找了一下ProtoBuf的文档,可以用它自 ...
- Google protobuf序列化以及反序列化
序列化的目的是将对象持久化到硬盘或者用于网络传输.java也提供了序列化技术,非常简单,只要实现Serializable接口即可.如下: public class commonService impl ...
- c++ protobuf序列化
只看了int类型的序列化,后面的有时间再研究 #include <vector> #include <iostream> int main() { ; while (true) ...
随机推荐
- java1.8新特性之stream流式算法
在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: List& ...
- python中的关键字yield有什么作用?
保存当前运行状态,然后暂停执行,即将函数挂起.yield关键字后面表达式的值作为返回值返回.当使用next(),send()函数从断点处继续执行.
- 重启hdfs集群的时候,报大量的gc问题。
问题现象: 2019-03-11 12:30:52,174 INFO org.apache.hadoop.util.JvmPauseMonitor: Detected pause in JVM or ...
- Comet OJ - Contest #6 B.双倍快乐(二维最大上升子序列和)
双倍快乐 题目描述 Illyasviel:"你想要最长不下降子序列吗?" star-dust:"好啊!" Illyasviel:"老板,给我整两个最长 ...
- Nginx之web服务器
Nginx的介绍 Nginx是由俄罗斯的Igor Sysoev使用C语言开发的轻量级.高性能.开源.跨平台的Web服务器. Nginx使用基于事件驱动的架构能够并发处理百万级的TCP连接,高模块化的设 ...
- Vue学习手记03-路由跳转与路由嵌套
1.路由跳转 添加一个LearnVue.vue文件, 在router->index.js中 引入import Learn from '@/components/LearnVue' 在touter ...
- python wmi远程数据获取
- 到达型01背包---P1504 积木城堡
P1504 积木城堡 题解 到达型01背包 对于每一组城堡,它可以到达一些高度 但是我们要求的是所有背包可以到达的公共高度的最大值 f[ i ] 表示对于一组城堡,能否到达高度 j ,然后我们跑 n ...
- gis空间分析案例_7参数单坐标转换
gis空间分析案例_7参数单坐标转换 商务科技合作:向日葵,135-4855__4328,xiexiaokui#qq.com 功能: 对输入的单个坐标,利用7参数,一步进行坐标变换,使用极为直观,极大 ...
- jeecg使用心得
接触到jeecg框架是在去年,接触到了jeecg开源框架,此框架为企业级急速开发框架,不了解的可以百度下这类框架的,对于目前状态来说,此框架确实也满足了所需,此刻就开始接触jeecg框架,去年六七月份 ...