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) ...
随机推荐
- 用Java实现自动打开浏览器在搜索框中进行搜索
主要使用了Java的剪切板操作和Robot类 上代码: package pers.jeaven.AutoRobot.main; import java.awt.Desktop; import java ...
- 【SPOJ】Longest Common Substring
[SPOJ]Longest Common Substring 求两个字符串的最长公共子串 对一个串建好后缀自动机然后暴力跑一下 废话 讲一下怎么跑吧 从第一个字符开始遍历,遍历不到了再沿着\(pare ...
- P3180 [HAOI2016]地图
P3180 [HAOI2016]地图 显然,这是一个仙人掌图 inline void tarjan(LL u,LL fa){ low[u]=dfn[u]=++tot, pre[tot]=u; for( ...
- 适当设置,可以让win10显示更加和自己的意思
一.个性化设置: 1.桌面右击-->个性化-->背景-->图片浏览-->C:\Windows\Web\Screen\img101.png,选择契合度-->适应 2.桌面右 ...
- mysql的 UUID的生成方式
之前一直用的 int 自增的方式,之后总觉得缺少自信. 之后,我觉得采用uuid的方式,可能会好一些,至于用户统计排序等,则另用属性进行记录. 这里设计到一对矛盾: 安全性 与 网络带宽利 ...
- springboot集成Kafka
kafka和MQ的区别: 1)在架构模型方面, RabbitMQ遵循AMQP协议,RabbitMQ的broker由Exchange,Binding,queue组成,其中exchange和binding ...
- java基础类型源码解析之String
差点忘了最常用的String类型,我们对String的大多数方法都已经很熟了,这里就挑几个平时不会直接接触的点来解析一下. 先来看看它的成员变量 public final class String { ...
- 解决微信小程序要求TLS版本不低于1.2问题
客官,本文可在我的小站中看到哦 昨天项目服务器发生意外,其上的IIS服务无法使用,导致项目后台瘫痪,倒腾一番最终以无法修复告终,启用备用的服务器,从安装IIS环境开始,然后最后所有的东西都准备就绪,却 ...
- EL表达式 与 JSTL标准标签库
目录 EL表达式 什么是EL表达式 作用 EL内置11对象 EL执行表达式 JSTL 什么是JSTL JSTL标准标签库有5个子库 把JSTL标签库jar包引入工程当中 if标签 foreach标签 ...
- git submodule 如何push代码
某git项目关联了一个submodule 如何更新该项目下的submodule https://stackoverflow.com/questions/5814319/git-submodule-pu ...