protobuf使用

1)下载windows下probuf可执行文件,用于开发过程中生成protobuf的类结果。这里使用的是protoc-2.4.1-win32.zip,解压以后将protoc.exe的路径配置到系统路径中,使系统可以识别此命令。

2)验证,在protoc.exe同路径下建立一个测试文件peopleProtobuf.proto, 内容如下:

package com.test;
message People {
    optional int64 id=1;
    optional string name=2;
    optional string sex=3;
    optional string tel=4;
}


在消息定义中,每个字段都有唯一的一个标识符,可以理解为索引,用于识别各个字段
id=1,name=2,sex=3,tel=4,1,2,3,4并不是默认值


具体支持的变量类型如下:

.proto类型

Java 类型

C++类型

备注

double

double

double

 

float

float

float

 

int32

int

int32

使用可变长编码方式。编码负数时不够高效——如果你的字段可能含有负数,那么请使用sint32。

int64

long

int64

使用可变长编码方式。编码负数时不够高效——如果你的字段可能含有负数,那么请使用sint64。

uint32

int[1]

uint32

Uses variable-length encoding.

uint64

long[1]

uint64

Uses variable-length encoding.

sint32

int

int32

使用可变长编码方式。有符号的整型值。编码时比通常的int32高效。

sint64

long

int64

使用可变长编码方式。有符号的整型值。编码时比通常的int64高效。

fixed32

int[1]

uint32

总是4个字节。如果数值总是比总是比228大的话,这个类型会比uint32高效。

fixed64

long[1]

uint64

总是8个字节。如果数值总是比总是比256大的话,这个类型会比uint64高效。

sfixed32

int

int32

总是4个字节。

sfixed64

long

int64

总是8个字节。

bool

boolean

bool

 

string

String

string

一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本。

bytes

ByteString

string

可能包含任意顺序的字节数据。


在命令行切换到该目录,执行protoc.exe --java_out=./ peopleProtobuf.proto

在该目录下会生成java类文件,供后续序列化、反序列化使用。

3)与eclipse, maven集成

将上述生成类文件的过程与eclipse,maven进行集成。

首先创建一个maven工程,然后将peopleProtobuf.proto放到工程的src/main/proto的目录下,配置pom如下:

<plugin>
	<artifactId>maven-antrun-plugin</artifactId>
        <executions>
	    <execution>
	        <id>compile-protoc</id>
		<phase>generate-sources</phase>
		<configuration>
			<tasks>
			     <mkdir dir="src/main/gen-java" />
			     <path id="proto.path">
			         <fileset dir="src/main/proto">
			             <include name="**/*.proto" />
			         </fileset>
			     </path>
			     <pathconvert pathsep=" " property="proto.files"
			                        refid="proto.path" />
			     <exec executable="protoc">
			          <arg value="--java_out=src/main/gen-java" />
			          <arg value="-I${project.basedir}/src/main/proto" />
			          <arg line="${proto.files}" />
			     </exec>
			</tasks>
			<sourceRoot>src/main/gen-java</sourceRoot>
		</configuration>
		<goals>
		    <goal>run</goal>
		</goals>
	    </execution>
	</executions>
</plugin>
<plugin>
	<artifactId>maven-clean-plugin</artifactId>
	<configuration>
	    <verbose>true</verbose>
	    <filesets>
		<fileset>
		    <directory>src/main/gen-java</directory>
		</fileset>
	    </filesets>
	</configuration>
</plugin>

执行maven generate-sources即可生成类文件。


4)序列化、反序列化

import com.google.protobuf.InvalidProtocolBufferException;
import com.test.PeopleProtobuf;
import com.test.PeopleProtobuf.People;

public class ProtoTest {
	public static void main(String[] args) {
        PeopleProtobuf.People.Builder builder = PeopleProtobuf.People.newBuilder();
        builder.setId(12345);
        builder.setName("TestName");
        builder.setSex("Male");
        builder.setTel("99999");
        People people = builder.build();
        byte[] ser = people.toByteArray();
        System.out.println("serialization result: " + ser);
        People peopleResult;
	try {
	     peopleResult = People.parseFrom(ser);
	     System.out.println("deserialization result is: " + 
			peopleResult.getId() + "," + peopleResult.getName() + ", " + peopleResult.getSex() + "," + peopleResult.getTel());
	} catch (InvalidProtocolBufferException e) {
             e.printStackTrace();
	}
    }
}

maven示例源码工程:

http://download.csdn.net/detail/sundongsdu/8956167

相关下载包:

http://download.csdn.net/detail/sundongsdu/8955915

参考文献:

http://blog.csdn.net/ajun_studio/article/details/7693056

http://stackoverflow.com/questions/1578456/integrate-protocol-buffers-into-maven2-build



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值