一、使用
1.1 限定修飾符
- required: 表示是一個必須字段,發送之前沒有設置required字段或者無法識別required字段都會引發編解碼異常,導致消息被丟棄。
- Optional:表示是一個可選字段,可選對於發送方,在發送消息時,可以有選擇性的設置或者不設置該字段的值。對於接收方,如果能夠識別可選字段就進行相應的處理,如果無法識別,則忽略該字段,消息中的其它字段正常處理。
- Repeated:表示該字段可以包含0~N個元素。其特性和optional一樣,但是每一次可以包含多個值。可以看作是在傳遞一個數組的值。
1.2 基本類型
- bool: 布爾類型 1字節
- int32: 32位有符號整數
- uin32: 32位無符號整數
- int64: 64位有符號整數
- uin64:64位無符號整數
- sint32:32位整數,處理負數效率更高
- sint64:64位整數,處理負數效率更高
- double: 64位浮點數
- string: 只能處理ASCII字符
- bytes:用於處理多字節的語言字符、如中午
關於 fixed32 和int32的區別。fixed32的打包效率比int32的效率高,但是使用的空間一般比int32多。因此一個屬於時間效率高,一個屬於空間效率高。根據項目的實際情況,一般選擇fixed32,如果遇到對傳輸數據量要求比較苛刻的環境,可以選擇int32.
1.3 枚舉(enum)
枚舉的定義形式和Java的Enum定義差不多,例如:
enum PhoneType {
MOBILE=0;
HOME=1;
WORK=2;
}
1.4 結構體(message)
message,類似於C語言中的結構體。例如:
message Login
{
optional string username = 1;
optional string password = 2;
}
1.5 字段名稱
字段名稱的命名與C、C++、Java等語言的變量命名方式幾乎是相同的。
protobuf建議字段的命名採用以下劃線分割的駝峯式。例如 first_name 而不是firstName.
1.6 字段編碼值
1900~2000編碼值爲Google protobuf 系統內部保留值,建議不要在自己的項目中使用。
1.7 protobuf java的使用
1創建一個新的工程Protobuf,將protoc.exe文件拷貝到當前目錄2在protoc.exe同級目錄創建helloworld.proto文件,代碼如下
message Person {
// ID(必需)
required int32 id = 1;
// 姓名(必需)
required string name = 2;
// email(可選)
optional string email = 3;
// 朋友(集合)
repeated string friends = 4;
}
3使用命令:protoc.exe --java_out=./ helloworld.proto,編譯helloworld.proto文件5把Helloworld.java文件和protobuf-java-2.6.1.jar引入到eclipse項目
6序列化代碼
Helloworld.Person.Builder builder = Helloworld.Person.newBuilder();
builder.setId(1);
builder.setName("小毛驢");
builder.setEmail("[email protected]");
Helloworld.Person person = builder.build();
byte[] result = person.toByteArray();
7反序列化代碼 try {
Helloworld.Person person1 = Helloworld.Person.parseFrom(result);
System.out.println(person1);
} catch (InvalidProtocolBufferException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
8運行結果控制檯: +------------------------------------------------------------------+ id: 1 name: "\345\260\217\346\257\233\351\251\264" email: "[email protected]" +------------------------------------------------------------------+