前言

protobuf的编译,官方文档建议使用maven,因此如果没有maven先安装maven.
windows下可能会只配置了IDE的java环境.如果想用CMD来编译protobuf的话,需要在windows环境变量中配置JAVA_HOME.

安装

安装maven

http://maven.apache.org/download.cgi 下载最新maven
解压到喜欢的英文目录,配置环境变量:
在path中加入maven路径.
在cmd中用mvn -v测试

安装protobuf

在GitHub上下载 https://github.com/google/protobuf/releases,windows下需要下载java和win32.这里下载的3.5.0版本.
解压:
protobuf-java-3.5.0
protoc-3.5.0-win32
编译protobuf
将protoc-3.5.0-win32中的exe文件复制到protobuf-java-3.5.0目录下的scr\下
打开CMD进入protobuf-java-3.5.0/java/ 执行命令:

mvn package
  • 1

编译成功得到如下信息

生成的包在个文件夹中的target中,例如我这里是在protobuf-java-3.5.0/java/core/target中

如果采用maven项目的话可以不编译jar包,而加入如下信息

<dependency>  
    <groupId>com.google.protobuf</groupId>  
    <artifactId>protobuf-java</artifactId>  
    <version>3.5.0</version>  
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

Java使用protobuf

定义数据结构

定义protobuf的数据结构,这里要写一个.proto文件。这个文件有点类似于定义一个类。具体参照protobuf官方文档.

protoc.exe生成java文件

若要生成java文件,需要在proto文件开头加入

Syntax = "proto2";
  • 1

命令行运行:

protoc.exe --java_out=E:\java Immortaldb.proto
  • 1

输出文件夹是E:\java,输入是Immortaldb.proto
得到Immortaldb.java
将得到的java拷入工程,工程需要依赖之前得到的jar文件

序列化与反序列化

以Player为例
序列化,通过该类型的Builder的build方法来构建一个对象.再序列化对象

//Player序列化
public byte[] serializePlayer() throws IOException{
    byte[] byteArray = null;
    Immortaldb.Player.Builder playerBuilder= Immortaldb.Player.newBuilder();

    //这里应该有Player各项的赋值
    playerBuilder.setRoleid(12345);
    ……

    Immortaldb.Player player =  playerBuilder.build();

    // 将数据写到输出流,如网络输出流,这里用ByteArrayOutputStream来模拟
    ByteArrayOutputStream output = new ByteArrayOutputStream();  
       player.writeto(output);

       byteArray = output.toByteArray();        

    return byteArray;
}
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

反序列化:

//Player反序列化
public void decodePlayer(byte[] serial) throws InvalidProtocolBufferException {

    Immortaldb.Player player= Immortaldb.Player.parseFrom(serial);
    // 这里取Player的各个项
    long roleId = player.getRoleId();
    ……
}

Windows: proto生成java文件的更多相关文章

  1. 如何在PHP环境中使用ProtoBuf数据格式

    这篇文章主要介绍了如何在PHP环境中使用ProtoBuf数据格式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  2. python下grpc与protobuf的编写使用示例

    这篇文章主要为大家介绍了python下grpc与protobuf的编写使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪

  3. Android中Protobuf的基本使用介绍

    大家好,本篇文章主要讲的是Android中Protobuf的基本使用介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

  4. 如何在Vue中使用protobuf

    这篇文章主要介绍了如何在Vue中使用protobuf,protobuf是由google推出的和语言无关和平台无关,几乎支持当前的大部分语言,如JavaScript,下文更多相关介绍需要的小伙伴可以参考一下

  5. CentOS下安装protobuf

    二、protobuf安装获取安装包:官网地址或者CSDN解压安装包到指定目录、重命名:准备开始编译和安装:安装过程很简单,完成,开始使用吧~

  6. Ubuntu上安装protobuf 和protobuf-c

    第一步、下载安装包http://pan.baidu.com/s/1i43CzJn第二部、解压安装protobuf安装protobuf-c

  7. ubuntu没有左边栏

    由于protobuf装了几个版本,导致caffe编译的时候有问题,所以只保留了一个,删掉了其他的结果重启后Ubuntu的左边栏不见了,顶部导航条也没有了,窗口的x图标也不见了Nvidia的驱动也没有了运行unity或compiz报错,importerror...libprotobuf.so.9找不到什么的,晕,protobuf跟unity都有关系了结果只好装了一个protobuf-2.6.1,然后

  8. ubuntu16.04 php 使用 protocol buffer

    https://github.com/google/protobuf/releases2、解压编译器二、安装PB运行库1、由于初次在linux下使用PHP,所以按照官网提供的3种方式均未能成功安装pb运行库使用第一种方式编译:pear-->peclinstall...,编译阶段出错使用第二种方式编译:peclinstallprotobuf-3.4.0,报错找不到该文件,尝试下载低版本时提示下载最新版:((不知道有没有小伙伴安装成功过)(3)使用第三种方式:composer,官网说在自己工程的compose

  9. Ubuntu14.04下安装protobuf 2.6.1

    1.下载protobufhttps://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz2.安装protobuf3.检查是否安装成功若成功则显示:可能会出现错误或者还是显示的老版本号,错误原因:protobuf的默认安装路径是/usr/local/lib,而/usr/local/lib不在ubuntu

  10. Ubuntu14.04LTS安装TensorFlow

    转自:http://blog.csdn.net/vbskj/article/details/521077141.Pip如果已经安装过pip,可以跳过这里的安装步骤。$sudoapt-getinstallPython-pippython-devpython-setuptoolsbuild-essential$sudopipinstall--upgradepip$sudopipinstall--upg

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部