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