一,protocolbuffer简介
protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。它是一种协议,是谷歌推出的一种序列化协议,由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
二,protocolbuffer使用
1,首先准备protobuf-java-2.4.1.jar,protobuf-java-2.4.1-sources.jar,protoc.exe
2,编写一个protocol的配置文件 ,类似于thift里面的定义文件,如下所示,具体语法参考网络
option java_package = "com.proto";
option java_outer_classname = "PlayerModule";
message PBPlayer{
required int64 playerId = 1;
required int32 age = 2;
required string name = 3;
repeated int32 skills = 4;
}
message PBResource{
required int64 gold = 1;
required int32 energy = 2;
}
3,准备build.bat执行命令,如下
protoc ./proto/*.proto --java_out=./src
pause
4,执行完成后生成的文件
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: proto/player.proto
package com.proto;
public final class PlayerModule {
private PlayerModule() {}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistry registry) {
}
public interface PBPlayerOrBuilder
extends com.google.protobuf.MessageOrBuilder {
// required int64 playerId = 1;
boolean hasPlayerId();
long getPlayerId();
// required int32 age = 2;
boolean hasAge();
int getAge();
// required string name = 3;
boolean hasName();
String getName();
// repeated int32 skills = 4;
java.util.List<java.lang.Integer> getSkillsList();
int getSkillsCount();
int getSkills(int index);
}
public static final class PBPlayer extends
com.google.protobuf.GeneratedMessage
implements PBPlayerOrBuilder {
// Use PBPlayer.newBuilder() to construct.
private PBPlayer(Builder builder) {
super(builder);
}
private PBPlayer(boolean noInit) {}
private static final PBPlayer defaultInstance;
public static PBPlayer getDefaultInstance() {
return defaultInstance;
}
public PBPlayer getDefaultInstanceForType() {
return defaultInstance;
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return com.proto.PlayerModule.internal_static_PBPlayer_descriptor;
}
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
internalGetFieldAccessorTable() {
return com.proto.PlayerModule.internal_static_PBPlayer_fieldAccessorTable;
}
private int bitField0_;
// required int64 playerId = 1;
public static final int PLAYERID_FIELD_NUMBER = 1;
private long playerId_;
public boolean hasPlayerId() {
return ((bitField0_ & 0x00000001) == 0x00000001);
}
public long getPlayerId() {
return playerId_;
}
// required int32 age = 2;
public static final int AGE_FIELD_NUMBER = 2;
private int age_;
public boolean hasAge() {
return ((bitField0_ & 0x00000002) == 0x00000002);
}
public int getAge() {
return age_;
}
// required string name = 3;
public static final int NAME_FIELD_NUMBER = 3;
private java.lang.Object name_;
public boolean hasName() {
return ((bitField0_ & 0x00000004) == 0x00000004);
}
public String getName() {
java.lang.Object ref = name_;
if (ref instanceof String) {
return (String) ref;
} else {
com.google.protobuf.ByteString bs =
(com.google.protobuf.ByteString) ref;
String s = bs.toStringUtf8();
if (com.google.protobuf.Internal.isValidUtf8(bs)) {
name_ = s;
}
return s;
}
}
private com.google.protobuf.ByteString getNameBytes() {
java.lang.Object ref = name_;
if (ref instanceof String) {
com.google.protobuf.ByteString b =
com.google.protobuf.ByteString.copyFromUtf8((String) ref);
name_ = b;
return b;
} else {
return (com.google.protobuf.ByteString) ref;
}
}
// repeated int32 skills = 4;
public static final int SKILLS_FIELD_NUMBER = 4;
private java.util.List<java.lang.Integer> skills_;
public java.util.List<java.lang.Integer>
getSkillsList() {
return skills_;
}
public int getSkillsCount() {
return skills_.size();
}
public int getSkills(int index) {
return skills_.get(index);
}
private void initFields() {
playerId_ = 0L;
age_ = 0;
name_ = "";
skills_ = java.util.Collections.emptyList();;
}
private byte memoizedIsInitialized = -1;
public final boolean isInitialized() {
byte isInitialized = memoizedIsInitialized;
if (isInitialized != -1) return isInitialized == 1;
if (!hasPlayerId()) {
memoizedIsInitialized = 0;
return false;
}
if (!hasAge()) {
memoizedIsInitialized = 0;
return false;
}
if (!hasName()) {
memoizedIsInitialized = 0;
return false;
}
memoizedIsInitialized = 1;
return true;
}
public void writeTo(com.google.protobuf.CodedOutputStream output)
throws java.io.IOException {
getSerializedSize();
if (((bitField0_ & 0x00000001) == 0x00000001)) {
output.writeInt64(1, playerId_);
}
if (((bitField0_ & 0x00000002) == 0x00000002)) {
output.writeInt32(2, age_);
}
if (((bitField0_ & 0x00000004) == 0x00000004)) {
output.writeBytes(3, getNameBytes());
}
for (int i = 0; i < skills_.size(); i++) {
output.writeInt32(4, skills_.get(i));
}
getUnknownFields().writeTo(output);
}
private int memoizedSerializedSize = -1;
public int getSerializedSize() {
int size = memoizedSerializedSize;
if (size != -1) return size;
size = 0;
if (((bitField0_ & 0x00000001) == 0x00000001)) {
size += com.google.protobuf.CodedOutputStream
.computeInt64Size(1, playerId_);
}
if (((bitField0_ & 0x00000002) == 0x00000002)) {
size += com.google.protobuf.CodedOutputStream
.computeInt32Size(2, age_);
}
if (((bitField0_ & 0x00000004) == 0x00000004)) {
size += com.google.protobuf.CodedOutputStream
.computeBytesSize(3, getNameBytes());
}
{
int dataSize = 0;
for (int i = 0; i < skills_.size(); i++) {
dataSize += com.google.protobuf.CodedOutputStream
.computeInt32SizeNoTag(skills_.get(i));
}
size += dataSize;
size += 1 * getSkillsList().size();
}
size += getUnknownFields().getSerializedSize();
memoizedSerializedSize = size;
return size;
}
private static final long serialVersionUID = 0L;
@java.lang.Override
protected java.lang.Object writeReplace()
throws java.io.ObjectStreamException {
return super.writeReplace();
}
public static com.proto.PlayerModule.PBPlayer parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return newBuilder().mergeFrom(data).buildParsed();
}
public static com.proto.PlayerModule.PBPlayer parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)