2014-11-06 31 views
0

我使用protobuf的例子(對於C#和Java):Protobuf - 建造者不存在?

proto文件

package tutorial; 

option java_package = "com.example.tutorial"; 
option java_outer_classname = "AddressBookProtos"; 

message Person { 
    required string name = 1; 
    required int32 id = 2; 
    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; 
} 

message AddressBook { 
    repeated Person person = 1; 
} 

我已經有一個Person對象:

Person john = Person 
      .newBuilder() 
      .setId(1234) 
      .setName("John Doe") 
      .setEmail("[email protected]") 
      .addPhone(
        Person.PhoneNumber.newBuilder().setNumber("555-4321") 
          .setType(Person.PhoneType.HOME)).build(); 

現在讓我們假設香港專業教育學院讀了從流對象(工作正常),現在我想更新電子郵件:

的例子here說來:

enter image description here

所以我試圖讓電子郵件建設者,但我只看到這一點:

enter image description here

問題

如何修改這個人的myne,爲什麼確切的代碼不起作用?

回答

1

電子郵件沒有被定義爲在原文件中的子消息,是一個字符串。

Protoc生成消息作爲Java類,每個所生成的類具有誰延伸com.google.protobuf.GeneratedMessage.Builder一個Builder子類並實現所有necesary方法來工作,並且所述助洗劑是通過此時,相應的吸氣劑入店。

這就是爲什麼你不能得到******中國建設者

john.toBuilder().getPhoneBuilder(index); 

,並設置******中國領域的原因,是因爲被定義爲一個子消息,並有自己的生成器

message PhoneNumber { 
    required string number = 1; 
    optional PhoneType type = 2 [default = HOME]; 
    } 

,你不能獲得的電子郵件生成器,因爲該郵件並沒有因爲消息的子類存在(用他自己的建設者),被定義爲一個字符串和建造是Person類建設者

optional string email = 3; 

如果你想改變的電子郵件,你可以做

john.toBuilder().setEmail("[email protected]").buid(); 

這是一個有點混淆,但希望這有助於。

+0

從我的測試中,應該是'john = john.toBuilder()。setEmail(「[email protected]」)。build()' – 2014-11-07 08:03:54

+0

是的,你說得對,Royi,我忘了它。 – vzamanillo 2014-11-07 10:54:28