protobuffer序列化
一. 描述对象的proto文件
- 第一行package:对象经过protobuffer编译后形成java文件,这个文件放在按照package新建的文件夹内
- java_package:java类的包名
- java_outer_classname:java文件名,也是public class的名字
- message定义内部类Person,Person也是要序列化的类
- required表示该字段是必须字段,optional是可选字段
- repeated根据不同的消息类型解析数据包内的字段,用于自定义的类,数组等
package com.lj;
option java_package="com.lj";
option java_outer_classname="MyPerson"; message Person{
required string name=1;
required int32 id=2;
optional string email=3; message PhoneNumber{
required string number=1;
optional int32 type=2;
} repeated PhoneNumber phoneNumber=4;
}
二. 编译描述文件
protoc --proto_path=IMPORT_PATH --java_out=DST_DIR file.proto
三. 序列化与反序列化代码
- new Builder().build()方法创建序列化
- parseFrom()反序列化
public class TestProtocalBuffer {
/**
* protobuffer序列化 : 1.编写proto文件描述bean 2.命令生成代码 3.java代码调用
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException { MyPerson.Person p1 = MyPerson.Person.newBuilder()
.setName("lj").setId(25629).setEmail("lj72808up@163.com")
.addPhoneNumber(MyPerson.Person.PhoneNumber.newBuilder().setNumber("13905723516").setType(1)).build(); FileOutputStream os = new FileOutputStream("d://123.txt");
p1.writeTo(os); // 把文件
os.close(); } /**
* protobuffer读取文件反序列化成对象
* @throws IOException
*/
@Test
public void testRead() throws IOException {
FileInputStream is = new FileInputStream("d://123.txt");
MyPerson.Person person = MyPerson.Person.parseFrom(is);
System.out.println(person);
}
/** name: "lj"
id: 25629
email: "lj72808up@163.com"
phoneNumber {
number: "13905723516"
type: 1
} **/
}
protobuffer序列化的更多相关文章
- protobuf-net与FlatBuffers
protobuf-net Protobuf是google开源的一个项目,用户数据序列化反序列化,google声称google的数据通信都是用该序列化方法.它比xml格式要少的多,甚至比二进制数据格式也 ...
- 基于netty框架的轻量级RPC实现(附源码)
前言 Rpc( Remote procedure call):是一种请求 - 响应协议.RPC由客户端启动,客户端向已知的远程服务器发送请求消息,以使用提供的参数执行指定的过程.远程服务器向客户端发送 ...
- 基于.NET CORE微服务框架 -谈谈surging 的messagepack、protobuffer、json.net 序列化
1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...
- 使用RabbitMQ放置自己定义对象(不借助序列化工具,比如protobuffer)V2.0
怎样使用RabbitMQ盛放自己定义的对象呢?一般都会使用序列化工具在投放之前转换一次.从MQ取回的时候再逆序列化还原为本地对象.这里使用C++自带的强制类型装换,将本地对象的内存模型当做自然的序列化 ...
- Protocol buffer序列化及其在微信蓝牙协议中的应用
Protocol buffer是Google出品的一种轻便高效的结构化数据存储格式,可对结构化数据进行序列化,并具有语言无关.平台无关等特点,在通信协议和数据存储等领域已经得到广泛的应用.目前其已经提 ...
- Protostuff自定义序列化(Delegate)解析
背景 在使用Protostuff进行序列化的时候,不幸地遇到了一个问题,就是Timestamp作为字段的时候,转换出现问题,通过Protostuff转换后的结果都是1970-01-01 08:00:0 ...
- 基于.NET CORE微服务框架 -surging 基于messagepack、protobuffer、json.net 性能对比
1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...
- Python使用ProtoBuffer
Python使用ProtoBuffer Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储.通信协议等方面. 就可读性而言感 ...
- java序列化测试
0.前言 本文主要对几种常见Java序列化方式进行实现.包括Java原生以流的方法进行的序列化.Json序列化.FastJson序列化.Protobuff序列化. 1.Java原生序列化 Java原生 ...
随机推荐
- JavaWeb学习记录(十九)——jstl自定义标签之简单标签
一.简单标签共定义了5个方法: setJspContext方法 setParent和getParent方法 setJspBody方法 doTag方法 二.方法介绍 osetJspContext方法 用 ...
- PHP学习——数据类型
PHP的数据是存在类型的概念的,弱类型指的是变量可以存储任何类型!一共8种,分别是:整型.浮点型.布尔型.字符串(标量类型) 数组.对象(符合类型) null.资源(特殊类型) 分成三大类: 标量类型 ...
- CentOS怎样强制卸载PHP以及自定义安装PHP
很无语,CentOS居然php版本才5.1.6,很多开源的CMS无法安装. 查看php版本命令: #php -v 这个命令是删除不干净的 #yum remove php 因为使用这个命令以后再用 #p ...
- ie6 z-index(用父元素的优先级来解决)
父元素的优先级决定了子元素的优先级
- rsyslog日志服务的配置文件分析
基于rsyslog日志服务的日志 在不同的LINUX系统,实现的软件略有不同. syslog,rsyslog,syslog-ng,用于实现系统日志的管理. [root@asianux4 ~]# rpm ...
- Unity3d 适配机型
1,为了是更多机型能够安装你的游戏,Unity3d Device Filter设置:ARMv6 with VFP: 2,华为C8600,一运行强制停止: 参考网址:http://forum.unity ...
- EDIUS设置采集磁带的方法
EDIUS作为一款应用广泛的非线性视频编辑软件,将磁带记录的视频信号采集为可以编辑的数字视频信号的使用还是十分广泛的,毕竟磁带不同于数字存储单元,它在批量化的视频录制中表现出很大的优势.下面,小编跟大 ...
- HTML5之Canvas绘图实例——曲线图
实现正弦.余弦和正切函数画图(如下图):调试环境:Firefox
- ImportError: cannot import name 'NUMPY_MKL'
>>> import scipy Traceback (most recent call last): File "<stdin>", line 1, ...
- Oracle内存参数配置及版本问题
Oracle的内存配置与Oracle性能息息相关.从总体上讲,可以分为两大块:共享部分(主要是SGA)和进程独享部分(主要是PGA).在 32 位操作系统下 的Oracle版本,不时有项目反馈关于内存 ...