google 的 protobuf 是最近非常火的将结构对象进行序列化及反序列化的工具,据google称,已经应用在了google非常多的内部项目上。
1、下载protobuf,protoc:
https://code.google.com/p/protobuf/downloads/detail?name=protobuf-2.4.1.tar.bz2&can=2&q=
https://code.google.com/p/protobuf/downloads/detail?name=protoc-2.4.1-win32.zip&can=2&q=
2、下载下来的protoc放在 protobuf/java/src目录下
3、在protobuf/java目录下修改pom.xml(仅windows下需要修改)
<exec executable=”../src/protoc”>
修改为:
<exec executable=”src\protoc.exe”>
4、执行:
mvn test
mvn install 安装至 maven repository
mvn package 可以打包成jar包,供单独使用
mvn install -P lite 生成lite版本,lite缺少描述及反射功能,但在手机平台上推荐使用
这里我也打包了jar包,用来学习时使用。
5、在eclipse中创建java工程,来学习一下protobuf的使用
建立addressbook.proto
option java_package = “com.example.tutorial”;
message Person {
required string name = 1;
required int32 id = 2; // Unique ID number for this person.
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
// Our address book file is just one of these.
message AddressBook {
repeated Person person = 1;
}
执行:
protoc addressbook –java-out=.
使用方式:
Person p = Person.newBuilder().setName(“hello world”).setId(111)
.build();
System.out.println(p.toByteArray().length);
toByteArray()进行序列化,parseFrom()进行反序列化。
下面在maven中集成:
添加plugin:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<tasks>
<mkdir dir=”target/generated-sources” />
<exec executable=”protoc”>
<arg
value=”–java_out=target/generated-sources” />
<arg
value=”src/main/protobuf/test.proto” />
</exec>
</tasks>
<sourceRoot>
target/generated-sources
</sourceRoot>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
添加dependency:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.4.1</version>
</dependency>
里面有一个反射机制,需要查一下能起到什么作用
optimize_for 这个选项需要关注一下,如果开发手机网游,这个选项会有大用处。
option optimize_for = SPEED; // 默认
CODE_SIZE
LITE_RUNTIME //手机网游推荐使用这种
另外,需要检查一下protobuf的压缩。测试了一下,字符串好像并未压缩。
从smartfox上查找一下他们用的压缩工具,继续测试一下。
决定使用snappy算法。
https://github.com/dain/snappy
各种压缩算法在java平台上的测试结果。
实际测试后压缩效果不尽如人意,使用了deflate和snappy压缩算法,分别测试了小于20字节和120字节的压缩,只能压缩不到20%,初始怀疑protobuf的二进制已经充分优化过了,如果是这样的话,再消耗cpu进行压缩就没有必要了。但是也不排除测试的样本太少。可以等正式上线后,再回头进行压缩的测试。对了,snappy必须在jdk7下运行,因为用了到sun的非公开函数,所以需要注意一下是目标环境是否支持。
使用protobuf还有一个好处,可以避免使用java反射机制带来的效率降低。
0 条评论。