Google Protocol Buffers Java实例

Google Protocol Buffers 是 Google 公司开发的一款简洁、高效的数据序列化/反序列化的工具,有着跨平台、可扩展的优点,尤其适合作为数据存储和RPC数据交换格式。目前,已经被 Hadoop 用作其 RPC 模块的基础依赖。


本文将根据网络上流行的一个例子,用Java程序来直观地展示如何用 Protocol Buffers 进行代码生成、数据序列化存储以及数据反序列化读取的过程。


步骤:

1、环境搭建:

本文在 Windows 系统下进行开发,因此下载https://protobuf.googlecode.com/files/protoc-2.5.0-win32.zip。解压后便可直接使用:


2、创建好工作目录

注:父目录路径为D:\Study\ComputerStudy\BigData_Cloud\Protobuf\practise



3、编辑proto 文件 D:\Study\ComputerStudy\BigData_Cloud\Protobuf\practise\proto\addressbook.proto,以定义message对象

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package tutorial;    
  2. option java_package = "study.java.arithmetic.protobuf";    
  3. option java_outer_classname = "AddressBookProtos";    
  4. message Person {    
  5.   required string name = 1;    
  6.   required int32 id = 2;        // Unique ID number for this person.    
  7.   optional string email = 3;    
  8.   enum PhoneType {    
  9.     MOBILE = 0;    
  10.     HOME = 1;    
  11.     WORK = 2;    
  12.   }    
  13.   message PhoneNumber {    
  14.     required string number = 1;    
  15.     optional PhoneType type = 2 [default = HOME];    
  16.   }    
  17.   repeated PhoneNumber phone = 4;    
  18. }    
  19. // Our address book file is just one of these.    
  20. message AddressBook {    
  21.   repeated Person person = 1;    
  22. }   

4、通过proto文件自动生成java代码

命令:protoc -I=D:\\Study\\ComputerStudy\\BigData_Cloud\\Protobuf\\practise\\ --java_out=D:\\Study\\ComputerStudy\\BigData_Cloud\\Protobuf\\practise\\src D:\\Study\\ComputerStudy\\BigData_Cloud\\Protobuf\\practise\\proto\\addressbook.proto

注:AddressBookProtos.java代码在本文最后的“附-1”部分


5、创建 Java 工程,并将protobuf-java-2.5.0.jar包加入到工程classpath中。然后,将自动生成的AddressBookProtos.java添加进工程

6、在工程的同一个文件夹下,创建AddPerson.java类——该类负责将数据写入PB的存储文件中:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package study.java.arithmetic.protobuf;  
  2.   
  3. import study.java.arithmetic.protobuf.AddressBookProtos.AddressBook;    
  4. import study.java.arithmetic.protobuf.AddressBookProtos.Person;     
  5. import java.io.BufferedReader;    
  6. import java.io.FileInputStream;    
  7. import java.io.FileNotFoundException;    
  8. import java.io.FileOutputStream;     
  9. import java.io.InputStreamReader;      
  10. import java.io.IOException;      
  11. import java.io.PrintStream;        
  12. class AddPerson{        
  13.     // This function fills in a Person message based on user input.        
  14.     static Person PromptForAddress(BufferedReader stdin,PrintStream stdout)throws IOException{          
  15.         Person.Builder person = Person.newBuilder();    
  16.         stdout.print("Enter person ID: ");          
  17.         person.setId(Integer.valueOf(stdin.readLine()));            
  18.         stdout.print("Enter name: ");          
  19.         person.setName(stdin.readLine());            
  20.         stdout.print("Enter email address (blank for none): ");          
  21.         String email = stdin.readLine();          
  22.         if (email.length() > 0){            
  23.             person.setEmail(email);         
  24.         }           
  25.         while (true){            
  26.             stdout.print("Enter a phone number (or leave blank to finish): ");    
  27.             String number = stdin.readLine();            
  28.             if (number.length() == 0){              
  29.                 break;            
  30.             }              
  31.             Person.PhoneNumber.Builder phoneNumber = Person.PhoneNumber.newBuilder().setNumber(number);    
  32.             stdout.print("Is this a mobile, home, or work phone? ");            
  33.             String type = stdin.readLine();            
  34.             if (type.equals("mobile")){              
  35.                 phoneNumber.setType(Person.PhoneType.MOBILE);        
  36.             } else if (type.equals("home")) {              
  37.                 phoneNumber.setType(Person.PhoneType.HOME);            
  38.             } else if (type.equals("work")) {             
  39.                 phoneNumber.setType(Person.PhoneType.WORK);            
  40.             } else {              
  41.                 stdout.println("Unknown phone type.  Using default.");            
  42.             }              
  43.             person.addPhone(phoneNumber);          
  44.         }            
  45.         return person.build();        
  46.     }          
  47.     // Main function: Reads the entire address book from a file,  adds one person based on user input,     
  48.     //then writes it back out to the same file.        
  49.     public static void main(String[] args) throws Exception{          
  50.         if (args.length != 1) {            
  51.             System.err.println("Usage:  AddPerson ADDRESS_BOOK_FILE");            
  52.             System.exit(-1);          
  53.         }            
  54.         AddressBook.Builder addressBook = AddressBook.newBuilder();            
  55.         // Read the existing address book.          
  56.         try {            
  57.             addressBook.mergeFrom(new FileInputStream(args[0]));          
  58.         } catch (FileNotFoundException e) {            
  59.             System.out.println(args[0] + ": File not found.  Creating a new file.");          
  60.         }            
  61.         // Add an address.          
  62.         addressBook.addPerson(            
  63.             PromptForAddress(new BufferedReader(new InputStreamReader(System.in)), System.out));            
  64.         // Write the new address book back to disk.          
  65.         FileOutputStream output = new FileOutputStream(args[0]);          
  66.         addressBook.build().writeTo(output);         
  67.         output.close();        
  68.     }     
  69. }    

7、执行AddPerson.java类的main方法,并输入参数“D:\\Study\\ComputerStudy\\BigData_Cloud\\Protobuf\\practise\\file\\addressbook”作为数据存储文件的位置。

根据提示,逐一输入 Person 对象的属性值:



最后,该类将Person对象数据写入到指定的PB的存储文件D:\\Study\\ComputerStudy\\BigData_Cloud\\Protobuf\\practise\\file\\addressbook中。文件格式为二进制:


8、编写 Java 类ListPeople.java,用于从存储文件中反序列化对象

ListPeople.java:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package study.java.arithmetic.protobuf;  
  2.   
  3. import study.java.arithmetic.protobuf.AddressBookProtos.AddressBook;    
  4. import study.java.arithmetic.protobuf.AddressBookProtos.Person;    
  5. import java.io.FileInputStream;          
  6.     public class ListPeople {        
  7.         // Iterates though all people in the AddressBook and prints info about them.        
  8.         static void Print(AddressBook addressBook) {          
  9.             for (Person person: addressBook.getPersonList()) {            
  10.                 System.out.println("Person ID: " + person.getId());            
  11.                 System.out.println("  Name: " + person.getName());            
  12.                 if (person.hasEmail()) {              
  13.                     System.out.println("  E-mail address: " + person.getEmail());            
  14.                 }              
  15.                 for (Person.PhoneNumber phoneNumber : person.getPhoneList()) {              
  16.                     switch (phoneNumber.getType()) {                
  17.                         case MOBILE:                  
  18.                             System.out.print("  Mobile phone #: ");                  
  19.                             break;                
  20.                         case HOME:                  
  21.                             System.out.print("  Home phone #: ");                  
  22.                             break;                
  23.                         case WORK:                  
  24.                             System.out.print("  Work phone #: ");                  
  25.                         break;              
  26.                     }              
  27.                     System.out.println(phoneNumber.getNumber());            
  28.                 }          
  29.             }        
  30.         }          
  31.         // Main function:  Reads the entire address book from a file and prints all  the information inside.        
  32.         /**  
  33.          * @param args  
  34.          * @throws Exception  
  35.          */    
  36.         public static void main(String[] args) throws Exception {          
  37.             if (args.length != 1) {            
  38.                 System.err.println("Usage:  ListPeople ADDRESS_BOOK_FILE");            
  39.                 System.exit(-1);          
  40.             }            
  41.             // Read the existing address book.          
  42.             AddressBook addressBook = AddressBook.parseFrom(new FileInputStream(args[0]));    
  43.             Print(addressBook);        
  44.         }      
  45. }    

9、使用ListPeople.java 从存储文件D:\\Study\\ComputerStudy\\BigData_Cloud\\Protobuf\\practise\\file\\addressbook中反序列化Person对象:





附-1:AddressBookProtos.java代码

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // Generated by the protocol buffer compiler.  DO NOT EDIT!  
  2. // source: proto/addressbook.proto  
  3.   
  4. package study.java.arithmetic.protobuf;  
  5.   
  6. public final class AddressBookProtos {  
  7.   private AddressBookProtos() {}  
  8.   public static void registerAllExtensions(  
  9.       com.google.protobuf.ExtensionRegistry registry) {  
  10.   }  
  11.   public interface PersonOrBuilder  
  12.       extends com.google.protobuf.MessageOrBuilder {  
  13.   
  14.     // required string name = 1;  
  15.     /** 
  16.      * <code>required string name = 1;</code> 
  17.      */  
  18.     boolean hasName();  
  19.     /** 
  20.      * <code>required string name = 1;</code> 
  21.      */  
  22.     java.lang.String getName();  
  23.     /** 
  24.      * <code>required string name = 1;</code> 
  25.      */  
  26.     com.google.protobuf.ByteString  
  27.         getNameBytes();  
  28.   
  29.     // required int32 id = 2;  
  30.     /** 
  31.      * <code>required int32 id = 2;</code> 
  32.      * 
  33.      * <pre> 
  34.      * Unique ID number for this person.   
  35.      * </pre> 
  36.      */  
  37.     boolean hasId();  
  38.     /** 
  39.      * <code>required int32 id = 2;</code> 
  40.      * 
  41.      * <pre> 
  42.      * Unique ID number for this person.   
  43.      * </pre> 
  44.      */  
  45.     int getId();  
  46.   
  47.     // optional string email = 3;  
  48.     /** 
  49.      * <code>optional string email = 3;</code> 
  50.      */  
  51.     boolean hasEmail();  
  52.     /** 
  53.      * <code>optional string email = 3;</code> 
  54.      */  
  55.     java.lang.String getEmail();  
  56.     /** 
  57.      * <code>optional string email = 3;</code> 
  58.      */  
  59.     com.google.protobuf.ByteString  
  60.         getEmailBytes();  
  61.   
  62.     // repeated .tutorial.Person.PhoneNumber phone = 4;  
  63.     /** 
  64.      * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  65.      */  
  66.     java.util.List<study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber>   
  67.         getPhoneList();  
  68.     /** 
  69.      * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  70.      */  
  71.     study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber getPhone(int index);  
  72.     /** 
  73.      * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  74.      */  
  75.     int getPhoneCount();  
  76.     /** 
  77.      * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  78.      */  
  79.     java.util.List<? extends study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumberOrBuilder>   
  80.         getPhoneOrBuilderList();  
  81.     /** 
  82.      * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  83.      */  
  84.     study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumberOrBuilder getPhoneOrBuilder(  
  85.         int index);  
  86.   }  
  87.   /** 
  88.    * Protobuf type {@code tutorial.Person} 
  89.    */  
  90.   public static final class Person extends  
  91.       com.google.protobuf.GeneratedMessage  
  92.       implements PersonOrBuilder {  
  93.     // Use Person.newBuilder() to construct.  
  94.     private Person(com.google.protobuf.GeneratedMessage.Builder<?> builder) {  
  95.       super(builder);  
  96.       this.unknownFields = builder.getUnknownFields();  
  97.     }  
  98.     private Person(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }  
  99.   
  100.     private static final Person defaultInstance;  
  101.     public static Person getDefaultInstance() {  
  102.       return defaultInstance;  
  103.     }  
  104.   
  105.     public Person getDefaultInstanceForType() {  
  106.       return defaultInstance;  
  107.     }  
  108.   
  109.     private final com.google.protobuf.UnknownFieldSet unknownFields;  
  110.     @java.lang.Override  
  111.     public final com.google.protobuf.UnknownFieldSet  
  112.         getUnknownFields() {  
  113.       return this.unknownFields;  
  114.     }  
  115.     private Person(  
  116.         com.google.protobuf.CodedInputStream input,  
  117.         com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  118.         throws com.google.protobuf.InvalidProtocolBufferException {  
  119.       initFields();  
  120.       int mutable_bitField0_ = 0;  
  121.       com.google.protobuf.UnknownFieldSet.Builder unknownFields =  
  122.           com.google.protobuf.UnknownFieldSet.newBuilder();  
  123.       try {  
  124.         boolean done = false;  
  125.         while (!done) {  
  126.           int tag = input.readTag();  
  127.           switch (tag) {  
  128.             case 0:  
  129.               done = true;  
  130.               break;  
  131.             default: {  
  132.               if (!parseUnknownField(input, unknownFields,  
  133.                                      extensionRegistry, tag)) {  
  134.                 done = true;  
  135.               }  
  136.               break;  
  137.             }  
  138.             case 10: {  
  139.               bitField0_ |= 0x00000001;  
  140.               name_ = input.readBytes();  
  141.               break;  
  142.             }  
  143.             case 16: {  
  144.               bitField0_ |= 0x00000002;  
  145.               id_ = input.readInt32();  
  146.               break;  
  147.             }  
  148.             case 26: {  
  149.               bitField0_ |= 0x00000004;  
  150.               email_ = input.readBytes();  
  151.               break;  
  152.             }  
  153.             case 34: {  
  154.               if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) {  
  155.                 phone_ = new java.util.ArrayList<study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber>();  
  156.                 mutable_bitField0_ |= 0x00000008;  
  157.               }  
  158.               phone_.add(input.readMessage(study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.PARSER, extensionRegistry));  
  159.               break;  
  160.             }  
  161.           }  
  162.         }  
  163.       } catch (com.google.protobuf.InvalidProtocolBufferException e) {  
  164.         throw e.setUnfinishedMessage(this);  
  165.       } catch (java.io.IOException e) {  
  166.         throw new com.google.protobuf.InvalidProtocolBufferException(  
  167.             e.getMessage()).setUnfinishedMessage(this);  
  168.       } finally {  
  169.         if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) {  
  170.           phone_ = java.util.Collections.unmodifiableList(phone_);  
  171.         }  
  172.         this.unknownFields = unknownFields.build();  
  173.         makeExtensionsImmutable();  
  174.       }  
  175.     }  
  176.     public static final com.google.protobuf.Descriptors.Descriptor  
  177.         getDescriptor() {  
  178.       return study.java.arithmetic.protobuf.AddressBookProtos.internal_static_tutorial_Person_descriptor;  
  179.     }  
  180.   
  181.     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable  
  182.         internalGetFieldAccessorTable() {  
  183.       return study.java.arithmetic.protobuf.AddressBookProtos.internal_static_tutorial_Person_fieldAccessorTable  
  184.           .ensureFieldAccessorsInitialized(  
  185.               study.java.arithmetic.protobuf.AddressBookProtos.Person.class, study.java.arithmetic.protobuf.AddressBookProtos.Person.Builder.class);  
  186.     }  
  187.   
  188.     public static com.google.protobuf.Parser<Person> PARSER =  
  189.         new com.google.protobuf.AbstractParser<Person>() {  
  190.       public Person parsePartialFrom(  
  191.           com.google.protobuf.CodedInputStream input,  
  192.           com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  193.           throws com.google.protobuf.InvalidProtocolBufferException {  
  194.         return new Person(input, extensionRegistry);  
  195.       }  
  196.     };  
  197.   
  198.     @java.lang.Override  
  199.     public com.google.protobuf.Parser<Person> getParserForType() {  
  200.       return PARSER;  
  201.     }  
  202.   
  203.     /** 
  204.      * Protobuf enum {@code tutorial.Person.PhoneType} 
  205.      */  
  206.     public enum PhoneType  
  207.         implements com.google.protobuf.ProtocolMessageEnum {  
  208.       /** 
  209.        * <code>MOBILE = 0;</code> 
  210.        */  
  211.       MOBILE(00),  
  212.       /** 
  213.        * <code>HOME = 1;</code> 
  214.        */  
  215.       HOME(11),  
  216.       /** 
  217.        * <code>WORK = 2;</code> 
  218.        */  
  219.       WORK(22),  
  220.       ;  
  221.   
  222.       /** 
  223.        * <code>MOBILE = 0;</code> 
  224.        */  
  225.       public static final int MOBILE_VALUE = 0;  
  226.       /** 
  227.        * <code>HOME = 1;</code> 
  228.        */  
  229.       public static final int HOME_VALUE = 1;  
  230.       /** 
  231.        * <code>WORK = 2;</code> 
  232.        */  
  233.       public static final int WORK_VALUE = 2;  
  234.   
  235.   
  236.       public final int getNumber() { return value; }  
  237.   
  238.       public static PhoneType valueOf(int value) {  
  239.         switch (value) {  
  240.           case 0return MOBILE;  
  241.           case 1return HOME;  
  242.           case 2return WORK;  
  243.           defaultreturn null;  
  244.         }  
  245.       }  
  246.   
  247.       public static com.google.protobuf.Internal.EnumLiteMap<PhoneType>  
  248.           internalGetValueMap() {  
  249.         return internalValueMap;  
  250.       }  
  251.       private static com.google.protobuf.Internal.EnumLiteMap<PhoneType>  
  252.           internalValueMap =  
  253.             new com.google.protobuf.Internal.EnumLiteMap<PhoneType>() {  
  254.               public PhoneType findValueByNumber(int number) {  
  255.                 return PhoneType.valueOf(number);  
  256.               }  
  257.             };  
  258.   
  259.       public final com.google.protobuf.Descriptors.EnumValueDescriptor  
  260.           getValueDescriptor() {  
  261.         return getDescriptor().getValues().get(index);  
  262.       }  
  263.       public final com.google.protobuf.Descriptors.EnumDescriptor  
  264.           getDescriptorForType() {  
  265.         return getDescriptor();  
  266.       }  
  267.       public static final com.google.protobuf.Descriptors.EnumDescriptor  
  268.           getDescriptor() {  
  269.         return study.java.arithmetic.protobuf.AddressBookProtos.Person.getDescriptor().getEnumTypes().get(0);  
  270.       }  
  271.   
  272.       private static final PhoneType[] VALUES = values();  
  273.   
  274.       public static PhoneType valueOf(  
  275.           com.google.protobuf.Descriptors.EnumValueDescriptor desc) {  
  276.         if (desc.getType() != getDescriptor()) {  
  277.           throw new java.lang.IllegalArgumentException(  
  278.             "EnumValueDescriptor is not for this type.");  
  279.         }  
  280.         return VALUES[desc.getIndex()];  
  281.       }  
  282.   
  283.       private final int index;  
  284.       private final int value;  
  285.   
  286.       private PhoneType(int index, int value) {  
  287.         this.index = index;  
  288.         this.value = value;  
  289.       }  
  290.   
  291.       // @@protoc_insertion_point(enum_scope:tutorial.Person.PhoneType)  
  292.     }  
  293.   
  294.     public interface PhoneNumberOrBuilder  
  295.         extends com.google.protobuf.MessageOrBuilder {  
  296.   
  297.       // required string number = 1;  
  298.       /** 
  299.        * <code>required string number = 1;</code> 
  300.        */  
  301.       boolean hasNumber();  
  302.       /** 
  303.        * <code>required string number = 1;</code> 
  304.        */  
  305.       java.lang.String getNumber();  
  306.       /** 
  307.        * <code>required string number = 1;</code> 
  308.        */  
  309.       com.google.protobuf.ByteString  
  310.           getNumberBytes();  
  311.   
  312.       // optional .tutorial.Person.PhoneType type = 2 [default = HOME];  
  313.       /** 
  314.        * <code>optional .tutorial.Person.PhoneType type = 2 [default = HOME];</code> 
  315.        */  
  316.       boolean hasType();  
  317.       /** 
  318.        * <code>optional .tutorial.Person.PhoneType type = 2 [default = HOME];</code> 
  319.        */  
  320.       study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneType getType();  
  321.     }  
  322.     /** 
  323.      * Protobuf type {@code tutorial.Person.PhoneNumber} 
  324.      */  
  325.     public static final class PhoneNumber extends  
  326.         com.google.protobuf.GeneratedMessage  
  327.         implements PhoneNumberOrBuilder {  
  328.       // Use PhoneNumber.newBuilder() to construct.  
  329.       private PhoneNumber(com.google.protobuf.GeneratedMessage.Builder<?> builder) {  
  330.         super(builder);  
  331.         this.unknownFields = builder.getUnknownFields();  
  332.       }  
  333.       private PhoneNumber(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }  
  334.   
  335.       private static final PhoneNumber defaultInstance;  
  336.       public static PhoneNumber getDefaultInstance() {  
  337.         return defaultInstance;  
  338.       }  
  339.   
  340.       public PhoneNumber getDefaultInstanceForType() {  
  341.         return defaultInstance;  
  342.       }  
  343.   
  344.       private final com.google.protobuf.UnknownFieldSet unknownFields;  
  345.       @java.lang.Override  
  346.       public final com.google.protobuf.UnknownFieldSet  
  347.           getUnknownFields() {  
  348.         return this.unknownFields;  
  349.       }  
  350.       private PhoneNumber(  
  351.           com.google.protobuf.CodedInputStream input,  
  352.           com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  353.           throws com.google.protobuf.InvalidProtocolBufferException {  
  354.         initFields();  
  355.         int mutable_bitField0_ = 0;  
  356.         com.google.protobuf.UnknownFieldSet.Builder unknownFields =  
  357.             com.google.protobuf.UnknownFieldSet.newBuilder();  
  358.         try {  
  359.           boolean done = false;  
  360.           while (!done) {  
  361.             int tag = input.readTag();  
  362.             switch (tag) {  
  363.               case 0:  
  364.                 done = true;  
  365.                 break;  
  366.               default: {  
  367.                 if (!parseUnknownField(input, unknownFields,  
  368.                                        extensionRegistry, tag)) {  
  369.                   done = true;  
  370.                 }  
  371.                 break;  
  372.               }  
  373.               case 10: {  
  374.                 bitField0_ |= 0x00000001;  
  375.                 number_ = input.readBytes();  
  376.                 break;  
  377.               }  
  378.               case 16: {  
  379.                 int rawValue = input.readEnum();  
  380.                 study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneType value = study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneType.valueOf(rawValue);  
  381.                 if (value == null) {  
  382.                   unknownFields.mergeVarintField(2, rawValue);  
  383.                 } else {  
  384.                   bitField0_ |= 0x00000002;  
  385.                   type_ = value;  
  386.                 }  
  387.                 break;  
  388.               }  
  389.             }  
  390.           }  
  391.         } catch (com.google.protobuf.InvalidProtocolBufferException e) {  
  392.           throw e.setUnfinishedMessage(this);  
  393.         } catch (java.io.IOException e) {  
  394.           throw new com.google.protobuf.InvalidProtocolBufferException(  
  395.               e.getMessage()).setUnfinishedMessage(this);  
  396.         } finally {  
  397.           this.unknownFields = unknownFields.build();  
  398.           makeExtensionsImmutable();  
  399.         }  
  400.       }  
  401.       public static final com.google.protobuf.Descriptors.Descriptor  
  402.           getDescriptor() {  
  403.         return study.java.arithmetic.protobuf.AddressBookProtos.internal_static_tutorial_Person_PhoneNumber_descriptor;  
  404.       }  
  405.   
  406.       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable  
  407.           internalGetFieldAccessorTable() {  
  408.         return study.java.arithmetic.protobuf.AddressBookProtos.internal_static_tutorial_Person_PhoneNumber_fieldAccessorTable  
  409.             .ensureFieldAccessorsInitialized(  
  410.                 study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.class, study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.Builder.class);  
  411.       }  
  412.   
  413.       public static com.google.protobuf.Parser<PhoneNumber> PARSER =  
  414.           new com.google.protobuf.AbstractParser<PhoneNumber>() {  
  415.         public PhoneNumber parsePartialFrom(  
  416.             com.google.protobuf.CodedInputStream input,  
  417.             com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  418.             throws com.google.protobuf.InvalidProtocolBufferException {  
  419.           return new PhoneNumber(input, extensionRegistry);  
  420.         }  
  421.       };  
  422.   
  423.       @java.lang.Override  
  424.       public com.google.protobuf.Parser<PhoneNumber> getParserForType() {  
  425.         return PARSER;  
  426.       }  
  427.   
  428.       private int bitField0_;  
  429.       // required string number = 1;  
  430.       public static final int NUMBER_FIELD_NUMBER = 1;  
  431.       private java.lang.Object number_;  
  432.       /** 
  433.        * <code>required string number = 1;</code> 
  434.        */  
  435.       public boolean hasNumber() {  
  436.         return ((bitField0_ & 0x00000001) == 0x00000001);  
  437.       }  
  438.       /** 
  439.        * <code>required string number = 1;</code> 
  440.        */  
  441.       public java.lang.String getNumber() {  
  442.         java.lang.Object ref = number_;  
  443.         if (ref instanceof java.lang.String) {  
  444.           return (java.lang.String) ref;  
  445.         } else {  
  446.           com.google.protobuf.ByteString bs =   
  447.               (com.google.protobuf.ByteString) ref;  
  448.           java.lang.String s = bs.toStringUtf8();  
  449.           if (bs.isValidUtf8()) {  
  450.             number_ = s;  
  451.           }  
  452.           return s;  
  453.         }  
  454.       }  
  455.       /** 
  456.        * <code>required string number = 1;</code> 
  457.        */  
  458.       public com.google.protobuf.ByteString  
  459.           getNumberBytes() {  
  460.         java.lang.Object ref = number_;  
  461.         if (ref instanceof java.lang.String) {  
  462.           com.google.protobuf.ByteString b =   
  463.               com.google.protobuf.ByteString.copyFromUtf8(  
  464.                   (java.lang.String) ref);  
  465.           number_ = b;  
  466.           return b;  
  467.         } else {  
  468.           return (com.google.protobuf.ByteString) ref;  
  469.         }  
  470.       }  
  471.   
  472.       // optional .tutorial.Person.PhoneType type = 2 [default = HOME];  
  473.       public static final int TYPE_FIELD_NUMBER = 2;  
  474.       private study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneType type_;  
  475.       /** 
  476.        * <code>optional .tutorial.Person.PhoneType type = 2 [default = HOME];</code> 
  477.        */  
  478.       public boolean hasType() {  
  479.         return ((bitField0_ & 0x00000002) == 0x00000002);  
  480.       }  
  481.       /** 
  482.        * <code>optional .tutorial.Person.PhoneType type = 2 [default = HOME];</code> 
  483.        */  
  484.       public study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneType getType() {  
  485.         return type_;  
  486.       }  
  487.   
  488.       private void initFields() {  
  489.         number_ = "";  
  490.         type_ = study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneType.HOME;  
  491.       }  
  492.       private byte memoizedIsInitialized = -1;  
  493.       public final boolean isInitialized() {  
  494.         byte isInitialized = memoizedIsInitialized;  
  495.         if (isInitialized != -1return isInitialized == 1;  
  496.   
  497.         if (!hasNumber()) {  
  498.           memoizedIsInitialized = 0;  
  499.           return false;  
  500.         }  
  501.         memoizedIsInitialized = 1;  
  502.         return true;  
  503.       }  
  504.   
  505.       public void writeTo(com.google.protobuf.CodedOutputStream output)  
  506.                           throws java.io.IOException {  
  507.         getSerializedSize();  
  508.         if (((bitField0_ & 0x00000001) == 0x00000001)) {  
  509.           output.writeBytes(1, getNumberBytes());  
  510.         }  
  511.         if (((bitField0_ & 0x00000002) == 0x00000002)) {  
  512.           output.writeEnum(2, type_.getNumber());  
  513.         }  
  514.         getUnknownFields().writeTo(output);  
  515.       }  
  516.   
  517.       private int memoizedSerializedSize = -1;  
  518.       public int getSerializedSize() {  
  519.         int size = memoizedSerializedSize;  
  520.         if (size != -1return size;  
  521.   
  522.         size = 0;  
  523.         if (((bitField0_ & 0x00000001) == 0x00000001)) {  
  524.           size += com.google.protobuf.CodedOutputStream  
  525.             .computeBytesSize(1, getNumberBytes());  
  526.         }  
  527.         if (((bitField0_ & 0x00000002) == 0x00000002)) {  
  528.           size += com.google.protobuf.CodedOutputStream  
  529.             .computeEnumSize(2, type_.getNumber());  
  530.         }  
  531.         size += getUnknownFields().getSerializedSize();  
  532.         memoizedSerializedSize = size;  
  533.         return size;  
  534.       }  
  535.   
  536.       private static final long serialVersionUID = 0L;  
  537.       @java.lang.Override  
  538.       protected java.lang.Object writeReplace()  
  539.           throws java.io.ObjectStreamException {  
  540.         return super.writeReplace();  
  541.       }  
  542.   
  543.       public static study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber parseFrom(  
  544.           com.google.protobuf.ByteString data)  
  545.           throws com.google.protobuf.InvalidProtocolBufferException {  
  546.         return PARSER.parseFrom(data);  
  547.       }  
  548.       public static study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber parseFrom(  
  549.           com.google.protobuf.ByteString data,  
  550.           com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  551.           throws com.google.protobuf.InvalidProtocolBufferException {  
  552.         return PARSER.parseFrom(data, extensionRegistry);  
  553.       }  
  554.       public static study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber parseFrom(byte[] data)  
  555.           throws com.google.protobuf.InvalidProtocolBufferException {  
  556.         return PARSER.parseFrom(data);  
  557.       }  
  558.       public static study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber parseFrom(  
  559.           byte[] data,  
  560.           com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  561.           throws com.google.protobuf.InvalidProtocolBufferException {  
  562.         return PARSER.parseFrom(data, extensionRegistry);  
  563.       }  
  564.       public static study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber parseFrom(java.io.InputStream input)  
  565.           throws java.io.IOException {  
  566.         return PARSER.parseFrom(input);  
  567.       }  
  568.       public static study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber parseFrom(  
  569.           java.io.InputStream input,  
  570.           com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  571.           throws java.io.IOException {  
  572.         return PARSER.parseFrom(input, extensionRegistry);  
  573.       }  
  574.       public static study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber parseDelimitedFrom(java.io.InputStream input)  
  575.           throws java.io.IOException {  
  576.         return PARSER.parseDelimitedFrom(input);  
  577.       }  
  578.       public static study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber parseDelimitedFrom(  
  579.           java.io.InputStream input,  
  580.           com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  581.           throws java.io.IOException {  
  582.         return PARSER.parseDelimitedFrom(input, extensionRegistry);  
  583.       }  
  584.       public static study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber parseFrom(  
  585.           com.google.protobuf.CodedInputStream input)  
  586.           throws java.io.IOException {  
  587.         return PARSER.parseFrom(input);  
  588.       }  
  589.       public static study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber parseFrom(  
  590.           com.google.protobuf.CodedInputStream input,  
  591.           com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  592.           throws java.io.IOException {  
  593.         return PARSER.parseFrom(input, extensionRegistry);  
  594.       }  
  595.   
  596.       public static Builder newBuilder() { return Builder.create(); }  
  597.       public Builder newBuilderForType() { return newBuilder(); }  
  598.       public static Builder newBuilder(study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber prototype) {  
  599.         return newBuilder().mergeFrom(prototype);  
  600.       }  
  601.       public Builder toBuilder() { return newBuilder(this); }  
  602.   
  603.       @java.lang.Override  
  604.       protected Builder newBuilderForType(  
  605.           com.google.protobuf.GeneratedMessage.BuilderParent parent) {  
  606.         Builder builder = new Builder(parent);  
  607.         return builder;  
  608.       }  
  609.       /** 
  610.        * Protobuf type {@code tutorial.Person.PhoneNumber} 
  611.        */  
  612.       public static final class Builder extends  
  613.           com.google.protobuf.GeneratedMessage.Builder<Builder>  
  614.          implements study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumberOrBuilder {  
  615.         public static final com.google.protobuf.Descriptors.Descriptor  
  616.             getDescriptor() {  
  617.           return study.java.arithmetic.protobuf.AddressBookProtos.internal_static_tutorial_Person_PhoneNumber_descriptor;  
  618.         }  
  619.   
  620.         protected com.google.protobuf.GeneratedMessage.FieldAccessorTable  
  621.             internalGetFieldAccessorTable() {  
  622.           return study.java.arithmetic.protobuf.AddressBookProtos.internal_static_tutorial_Person_PhoneNumber_fieldAccessorTable  
  623.               .ensureFieldAccessorsInitialized(  
  624.                   study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.class, study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.Builder.class);  
  625.         }  
  626.   
  627.         // Construct using study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.newBuilder()  
  628.         private Builder() {  
  629.           maybeForceBuilderInitialization();  
  630.         }  
  631.   
  632.         private Builder(  
  633.             com.google.protobuf.GeneratedMessage.BuilderParent parent) {  
  634.           super(parent);  
  635.           maybeForceBuilderInitialization();  
  636.         }  
  637.         private void maybeForceBuilderInitialization() {  
  638.           if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {  
  639.           }  
  640.         }  
  641.         private static Builder create() {  
  642.           return new Builder();  
  643.         }  
  644.   
  645.         public Builder clear() {  
  646.           super.clear();  
  647.           number_ = "";  
  648.           bitField0_ = (bitField0_ & ~0x00000001);  
  649.           type_ = study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneType.HOME;  
  650.           bitField0_ = (bitField0_ & ~0x00000002);  
  651.           return this;  
  652.         }  
  653.   
  654.         public Builder clone() {  
  655.           return create().mergeFrom(buildPartial());  
  656.         }  
  657.   
  658.         public com.google.protobuf.Descriptors.Descriptor  
  659.             getDescriptorForType() {  
  660.           return study.java.arithmetic.protobuf.AddressBookProtos.internal_static_tutorial_Person_PhoneNumber_descriptor;  
  661.         }  
  662.   
  663.         public study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber getDefaultInstanceForType() {  
  664.           return study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.getDefaultInstance();  
  665.         }  
  666.   
  667.         public study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber build() {  
  668.           study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber result = buildPartial();  
  669.           if (!result.isInitialized()) {  
  670.             throw newUninitializedMessageException(result);  
  671.           }  
  672.           return result;  
  673.         }  
  674.   
  675.         public study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber buildPartial() {  
  676.           study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber result = new study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber(this);  
  677.           int from_bitField0_ = bitField0_;  
  678.           int to_bitField0_ = 0;  
  679.           if (((from_bitField0_ & 0x00000001) == 0x00000001)) {  
  680.             to_bitField0_ |= 0x00000001;  
  681.           }  
  682.           result.number_ = number_;  
  683.           if (((from_bitField0_ & 0x00000002) == 0x00000002)) {  
  684.             to_bitField0_ |= 0x00000002;  
  685.           }  
  686.           result.type_ = type_;  
  687.           result.bitField0_ = to_bitField0_;  
  688.           onBuilt();  
  689.           return result;  
  690.         }  
  691.   
  692.         public Builder mergeFrom(com.google.protobuf.Message other) {  
  693.           if (other instanceof study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber) {  
  694.             return mergeFrom((study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber)other);  
  695.           } else {  
  696.             super.mergeFrom(other);  
  697.             return this;  
  698.           }  
  699.         }  
  700.   
  701.         public Builder mergeFrom(study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber other) {  
  702.           if (other == study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.getDefaultInstance()) return this;  
  703.           if (other.hasNumber()) {  
  704.             bitField0_ |= 0x00000001;  
  705.             number_ = other.number_;  
  706.             onChanged();  
  707.           }  
  708.           if (other.hasType()) {  
  709.             setType(other.getType());  
  710.           }  
  711.           this.mergeUnknownFields(other.getUnknownFields());  
  712.           return this;  
  713.         }  
  714.   
  715.         public final boolean isInitialized() {  
  716.           if (!hasNumber()) {  
  717.               
  718.             return false;  
  719.           }  
  720.           return true;  
  721.         }  
  722.   
  723.         public Builder mergeFrom(  
  724.             com.google.protobuf.CodedInputStream input,  
  725.             com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  726.             throws java.io.IOException {  
  727.           study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber parsedMessage = null;  
  728.           try {  
  729.             parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);  
  730.           } catch (com.google.protobuf.InvalidProtocolBufferException e) {  
  731.             parsedMessage = (study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber) e.getUnfinishedMessage();  
  732.             throw e;  
  733.           } finally {  
  734.             if (parsedMessage != null) {  
  735.               mergeFrom(parsedMessage);  
  736.             }  
  737.           }  
  738.           return this;  
  739.         }  
  740.         private int bitField0_;  
  741.   
  742.         // required string number = 1;  
  743.         private java.lang.Object number_ = "";  
  744.         /** 
  745.          * <code>required string number = 1;</code> 
  746.          */  
  747.         public boolean hasNumber() {  
  748.           return ((bitField0_ & 0x00000001) == 0x00000001);  
  749.         }  
  750.         /** 
  751.          * <code>required string number = 1;</code> 
  752.          */  
  753.         public java.lang.String getNumber() {  
  754.           java.lang.Object ref = number_;  
  755.           if (!(ref instanceof java.lang.String)) {  
  756.             java.lang.String s = ((com.google.protobuf.ByteString) ref)  
  757.                 .toStringUtf8();  
  758.             number_ = s;  
  759.             return s;  
  760.           } else {  
  761.             return (java.lang.String) ref;  
  762.           }  
  763.         }  
  764.         /** 
  765.          * <code>required string number = 1;</code> 
  766.          */  
  767.         public com.google.protobuf.ByteString  
  768.             getNumberBytes() {  
  769.           java.lang.Object ref = number_;  
  770.           if (ref instanceof String) {  
  771.             com.google.protobuf.ByteString b =   
  772.                 com.google.protobuf.ByteString.copyFromUtf8(  
  773.                     (java.lang.String) ref);  
  774.             number_ = b;  
  775.             return b;  
  776.           } else {  
  777.             return (com.google.protobuf.ByteString) ref;  
  778.           }  
  779.         }  
  780.         /** 
  781.          * <code>required string number = 1;</code> 
  782.          */  
  783.         public Builder setNumber(  
  784.             java.lang.String value) {  
  785.           if (value == null) {  
  786.     throw new NullPointerException();  
  787.   }  
  788.   bitField0_ |= 0x00000001;  
  789.           number_ = value;  
  790.           onChanged();  
  791.           return this;  
  792.         }  
  793.         /** 
  794.          * <code>required string number = 1;</code> 
  795.          */  
  796.         public Builder clearNumber() {  
  797.           bitField0_ = (bitField0_ & ~0x00000001);  
  798.           number_ = getDefaultInstance().getNumber();  
  799.           onChanged();  
  800.           return this;  
  801.         }  
  802.         /** 
  803.          * <code>required string number = 1;</code> 
  804.          */  
  805.         public Builder setNumberBytes(  
  806.             com.google.protobuf.ByteString value) {  
  807.           if (value == null) {  
  808.     throw new NullPointerException();  
  809.   }  
  810.   bitField0_ |= 0x00000001;  
  811.           number_ = value;  
  812.           onChanged();  
  813.           return this;  
  814.         }  
  815.   
  816.         // optional .tutorial.Person.PhoneType type = 2 [default = HOME];  
  817.         private study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneType type_ = study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneType.HOME;  
  818.         /** 
  819.          * <code>optional .tutorial.Person.PhoneType type = 2 [default = HOME];</code> 
  820.          */  
  821.         public boolean hasType() {  
  822.           return ((bitField0_ & 0x00000002) == 0x00000002);  
  823.         }  
  824.         /** 
  825.          * <code>optional .tutorial.Person.PhoneType type = 2 [default = HOME];</code> 
  826.          */  
  827.         public study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneType getType() {  
  828.           return type_;  
  829.         }  
  830.         /** 
  831.          * <code>optional .tutorial.Person.PhoneType type = 2 [default = HOME];</code> 
  832.          */  
  833.         public Builder setType(study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneType value) {  
  834.           if (value == null) {  
  835.             throw new NullPointerException();  
  836.           }  
  837.           bitField0_ |= 0x00000002;  
  838.           type_ = value;  
  839.           onChanged();  
  840.           return this;  
  841.         }  
  842.         /** 
  843.          * <code>optional .tutorial.Person.PhoneType type = 2 [default = HOME];</code> 
  844.          */  
  845.         public Builder clearType() {  
  846.           bitField0_ = (bitField0_ & ~0x00000002);  
  847.           type_ = study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneType.HOME;  
  848.           onChanged();  
  849.           return this;  
  850.         }  
  851.   
  852.         // @@protoc_insertion_point(builder_scope:tutorial.Person.PhoneNumber)  
  853.       }  
  854.   
  855.       static {  
  856.         defaultInstance = new PhoneNumber(true);  
  857.         defaultInstance.initFields();  
  858.       }  
  859.   
  860.       // @@protoc_insertion_point(class_scope:tutorial.Person.PhoneNumber)  
  861.     }  
  862.   
  863.     private int bitField0_;  
  864.     // required string name = 1;  
  865.     public static final int NAME_FIELD_NUMBER = 1;  
  866.     private java.lang.Object name_;  
  867.     /** 
  868.      * <code>required string name = 1;</code> 
  869.      */  
  870.     public boolean hasName() {  
  871.       return ((bitField0_ & 0x00000001) == 0x00000001);  
  872.     }  
  873.     /** 
  874.      * <code>required string name = 1;</code> 
  875.      */  
  876.     public java.lang.String getName() {  
  877.       java.lang.Object ref = name_;  
  878.       if (ref instanceof java.lang.String) {  
  879.         return (java.lang.String) ref;  
  880.       } else {  
  881.         com.google.protobuf.ByteString bs =   
  882.             (com.google.protobuf.ByteString) ref;  
  883.         java.lang.String s = bs.toStringUtf8();  
  884.         if (bs.isValidUtf8()) {  
  885.           name_ = s;  
  886.         }  
  887.         return s;  
  888.       }  
  889.     }  
  890.     /** 
  891.      * <code>required string name = 1;</code> 
  892.      */  
  893.     public com.google.protobuf.ByteString  
  894.         getNameBytes() {  
  895.       java.lang.Object ref = name_;  
  896.       if (ref instanceof java.lang.String) {  
  897.         com.google.protobuf.ByteString b =   
  898.             com.google.protobuf.ByteString.copyFromUtf8(  
  899.                 (java.lang.String) ref);  
  900.         name_ = b;  
  901.         return b;  
  902.       } else {  
  903.         return (com.google.protobuf.ByteString) ref;  
  904.       }  
  905.     }  
  906.   
  907.     // required int32 id = 2;  
  908.     public static final int ID_FIELD_NUMBER = 2;  
  909.     private int id_;  
  910.     /** 
  911.      * <code>required int32 id = 2;</code> 
  912.      * 
  913.      * <pre> 
  914.      * Unique ID number for this person.   
  915.      * </pre> 
  916.      */  
  917.     public boolean hasId() {  
  918.       return ((bitField0_ & 0x00000002) == 0x00000002);  
  919.     }  
  920.     /** 
  921.      * <code>required int32 id = 2;</code> 
  922.      * 
  923.      * <pre> 
  924.      * Unique ID number for this person.   
  925.      * </pre> 
  926.      */  
  927.     public int getId() {  
  928.       return id_;  
  929.     }  
  930.   
  931.     // optional string email = 3;  
  932.     public static final int EMAIL_FIELD_NUMBER = 3;  
  933.     private java.lang.Object email_;  
  934.     /** 
  935.      * <code>optional string email = 3;</code> 
  936.      */  
  937.     public boolean hasEmail() {  
  938.       return ((bitField0_ & 0x00000004) == 0x00000004);  
  939.     }  
  940.     /** 
  941.      * <code>optional string email = 3;</code> 
  942.      */  
  943.     public java.lang.String getEmail() {  
  944.       java.lang.Object ref = email_;  
  945.       if (ref instanceof java.lang.String) {  
  946.         return (java.lang.String) ref;  
  947.       } else {  
  948.         com.google.protobuf.ByteString bs =   
  949.             (com.google.protobuf.ByteString) ref;  
  950.         java.lang.String s = bs.toStringUtf8();  
  951.         if (bs.isValidUtf8()) {  
  952.           email_ = s;  
  953.         }  
  954.         return s;  
  955.       }  
  956.     }  
  957.     /** 
  958.      * <code>optional string email = 3;</code> 
  959.      */  
  960.     public com.google.protobuf.ByteString  
  961.         getEmailBytes() {  
  962.       java.lang.Object ref = email_;  
  963.       if (ref instanceof java.lang.String) {  
  964.         com.google.protobuf.ByteString b =   
  965.             com.google.protobuf.ByteString.copyFromUtf8(  
  966.                 (java.lang.String) ref);  
  967.         email_ = b;  
  968.         return b;  
  969.       } else {  
  970.         return (com.google.protobuf.ByteString) ref;  
  971.       }  
  972.     }  
  973.   
  974.     // repeated .tutorial.Person.PhoneNumber phone = 4;  
  975.     public static final int PHONE_FIELD_NUMBER = 4;  
  976.     private java.util.List<study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber> phone_;  
  977.     /** 
  978.      * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  979.      */  
  980.     public java.util.List<study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber> getPhoneList() {  
  981.       return phone_;  
  982.     }  
  983.     /** 
  984.      * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  985.      */  
  986.     public java.util.List<? extends study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumberOrBuilder>   
  987.         getPhoneOrBuilderList() {  
  988.       return phone_;  
  989.     }  
  990.     /** 
  991.      * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  992.      */  
  993.     public int getPhoneCount() {  
  994.       return phone_.size();  
  995.     }  
  996.     /** 
  997.      * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  998.      */  
  999.     public study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber getPhone(int index) {  
  1000.       return phone_.get(index);  
  1001.     }  
  1002.     /** 
  1003.      * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1004.      */  
  1005.     public study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumberOrBuilder getPhoneOrBuilder(  
  1006.         int index) {  
  1007.       return phone_.get(index);  
  1008.     }  
  1009.   
  1010.     private void initFields() {  
  1011.       name_ = "";  
  1012.       id_ = 0;  
  1013.       email_ = "";  
  1014.       phone_ = java.util.Collections.emptyList();  
  1015.     }  
  1016.     private byte memoizedIsInitialized = -1;  
  1017.     public final boolean isInitialized() {  
  1018.       byte isInitialized = memoizedIsInitialized;  
  1019.       if (isInitialized != -1return isInitialized == 1;  
  1020.   
  1021.       if (!hasName()) {  
  1022.         memoizedIsInitialized = 0;  
  1023.         return false;  
  1024.       }  
  1025.       if (!hasId()) {  
  1026.         memoizedIsInitialized = 0;  
  1027.         return false;  
  1028.       }  
  1029.       for (int i = 0; i < getPhoneCount(); i++) {  
  1030.         if (!getPhone(i).isInitialized()) {  
  1031.           memoizedIsInitialized = 0;  
  1032.           return false;  
  1033.         }  
  1034.       }  
  1035.       memoizedIsInitialized = 1;  
  1036.       return true;  
  1037.     }  
  1038.   
  1039.     public void writeTo(com.google.protobuf.CodedOutputStream output)  
  1040.                         throws java.io.IOException {  
  1041.       getSerializedSize();  
  1042.       if (((bitField0_ & 0x00000001) == 0x00000001)) {  
  1043.         output.writeBytes(1, getNameBytes());  
  1044.       }  
  1045.       if (((bitField0_ & 0x00000002) == 0x00000002)) {  
  1046.         output.writeInt32(2, id_);  
  1047.       }  
  1048.       if (((bitField0_ & 0x00000004) == 0x00000004)) {  
  1049.         output.writeBytes(3, getEmailBytes());  
  1050.       }  
  1051.       for (int i = 0; i < phone_.size(); i++) {  
  1052.         output.writeMessage(4, phone_.get(i));  
  1053.       }  
  1054.       getUnknownFields().writeTo(output);  
  1055.     }  
  1056.   
  1057.     private int memoizedSerializedSize = -1;  
  1058.     public int getSerializedSize() {  
  1059.       int size = memoizedSerializedSize;  
  1060.       if (size != -1return size;  
  1061.   
  1062.       size = 0;  
  1063.       if (((bitField0_ & 0x00000001) == 0x00000001)) {  
  1064.         size += com.google.protobuf.CodedOutputStream  
  1065.           .computeBytesSize(1, getNameBytes());  
  1066.       }  
  1067.       if (((bitField0_ & 0x00000002) == 0x00000002)) {  
  1068.         size += com.google.protobuf.CodedOutputStream  
  1069.           .computeInt32Size(2, id_);  
  1070.       }  
  1071.       if (((bitField0_ & 0x00000004) == 0x00000004)) {  
  1072.         size += com.google.protobuf.CodedOutputStream  
  1073.           .computeBytesSize(3, getEmailBytes());  
  1074.       }  
  1075.       for (int i = 0; i < phone_.size(); i++) {  
  1076.         size += com.google.protobuf.CodedOutputStream  
  1077.           .computeMessageSize(4, phone_.get(i));  
  1078.       }  
  1079.       size += getUnknownFields().getSerializedSize();  
  1080.       memoizedSerializedSize = size;  
  1081.       return size;  
  1082.     }  
  1083.   
  1084.     private static final long serialVersionUID = 0L;  
  1085.     @java.lang.Override  
  1086.     protected java.lang.Object writeReplace()  
  1087.         throws java.io.ObjectStreamException {  
  1088.       return super.writeReplace();  
  1089.     }  
  1090.   
  1091.     public static study.java.arithmetic.protobuf.AddressBookProtos.Person parseFrom(  
  1092.         com.google.protobuf.ByteString data)  
  1093.         throws com.google.protobuf.InvalidProtocolBufferException {  
  1094.       return PARSER.parseFrom(data);  
  1095.     }  
  1096.     public static study.java.arithmetic.protobuf.AddressBookProtos.Person parseFrom(  
  1097.         com.google.protobuf.ByteString data,  
  1098.         com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  1099.         throws com.google.protobuf.InvalidProtocolBufferException {  
  1100.       return PARSER.parseFrom(data, extensionRegistry);  
  1101.     }  
  1102.     public static study.java.arithmetic.protobuf.AddressBookProtos.Person parseFrom(byte[] data)  
  1103.         throws com.google.protobuf.InvalidProtocolBufferException {  
  1104.       return PARSER.parseFrom(data);  
  1105.     }  
  1106.     public static study.java.arithmetic.protobuf.AddressBookProtos.Person parseFrom(  
  1107.         byte[] data,  
  1108.         com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  1109.         throws com.google.protobuf.InvalidProtocolBufferException {  
  1110.       return PARSER.parseFrom(data, extensionRegistry);  
  1111.     }  
  1112.     public static study.java.arithmetic.protobuf.AddressBookProtos.Person parseFrom(java.io.InputStream input)  
  1113.         throws java.io.IOException {  
  1114.       return PARSER.parseFrom(input);  
  1115.     }  
  1116.     public static study.java.arithmetic.protobuf.AddressBookProtos.Person parseFrom(  
  1117.         java.io.InputStream input,  
  1118.         com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  1119.         throws java.io.IOException {  
  1120.       return PARSER.parseFrom(input, extensionRegistry);  
  1121.     }  
  1122.     public static study.java.arithmetic.protobuf.AddressBookProtos.Person parseDelimitedFrom(java.io.InputStream input)  
  1123.         throws java.io.IOException {  
  1124.       return PARSER.parseDelimitedFrom(input);  
  1125.     }  
  1126.     public static study.java.arithmetic.protobuf.AddressBookProtos.Person parseDelimitedFrom(  
  1127.         java.io.InputStream input,  
  1128.         com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  1129.         throws java.io.IOException {  
  1130.       return PARSER.parseDelimitedFrom(input, extensionRegistry);  
  1131.     }  
  1132.     public static study.java.arithmetic.protobuf.AddressBookProtos.Person parseFrom(  
  1133.         com.google.protobuf.CodedInputStream input)  
  1134.         throws java.io.IOException {  
  1135.       return PARSER.parseFrom(input);  
  1136.     }  
  1137.     public static study.java.arithmetic.protobuf.AddressBookProtos.Person parseFrom(  
  1138.         com.google.protobuf.CodedInputStream input,  
  1139.         com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  1140.         throws java.io.IOException {  
  1141.       return PARSER.parseFrom(input, extensionRegistry);  
  1142.     }  
  1143.   
  1144.     public static Builder newBuilder() { return Builder.create(); }  
  1145.     public Builder newBuilderForType() { return newBuilder(); }  
  1146.     public static Builder newBuilder(study.java.arithmetic.protobuf.AddressBookProtos.Person prototype) {  
  1147.       return newBuilder().mergeFrom(prototype);  
  1148.     }  
  1149.     public Builder toBuilder() { return newBuilder(this); }  
  1150.   
  1151.     @java.lang.Override  
  1152.     protected Builder newBuilderForType(  
  1153.         com.google.protobuf.GeneratedMessage.BuilderParent parent) {  
  1154.       Builder builder = new Builder(parent);  
  1155.       return builder;  
  1156.     }  
  1157.     /** 
  1158.      * Protobuf type {@code tutorial.Person} 
  1159.      */  
  1160.     public static final class Builder extends  
  1161.         com.google.protobuf.GeneratedMessage.Builder<Builder>  
  1162.        implements study.java.arithmetic.protobuf.AddressBookProtos.PersonOrBuilder {  
  1163.       public static final com.google.protobuf.Descriptors.Descriptor  
  1164.           getDescriptor() {  
  1165.         return study.java.arithmetic.protobuf.AddressBookProtos.internal_static_tutorial_Person_descriptor;  
  1166.       }  
  1167.   
  1168.       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable  
  1169.           internalGetFieldAccessorTable() {  
  1170.         return study.java.arithmetic.protobuf.AddressBookProtos.internal_static_tutorial_Person_fieldAccessorTable  
  1171.             .ensureFieldAccessorsInitialized(  
  1172.                 study.java.arithmetic.protobuf.AddressBookProtos.Person.class, study.java.arithmetic.protobuf.AddressBookProtos.Person.Builder.class);  
  1173.       }  
  1174.   
  1175.       // Construct using study.java.arithmetic.protobuf.AddressBookProtos.Person.newBuilder()  
  1176.       private Builder() {  
  1177.         maybeForceBuilderInitialization();  
  1178.       }  
  1179.   
  1180.       private Builder(  
  1181.           com.google.protobuf.GeneratedMessage.BuilderParent parent) {  
  1182.         super(parent);  
  1183.         maybeForceBuilderInitialization();  
  1184.       }  
  1185.       private void maybeForceBuilderInitialization() {  
  1186.         if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {  
  1187.           getPhoneFieldBuilder();  
  1188.         }  
  1189.       }  
  1190.       private static Builder create() {  
  1191.         return new Builder();  
  1192.       }  
  1193.   
  1194.       public Builder clear() {  
  1195.         super.clear();  
  1196.         name_ = "";  
  1197.         bitField0_ = (bitField0_ & ~0x00000001);  
  1198.         id_ = 0;  
  1199.         bitField0_ = (bitField0_ & ~0x00000002);  
  1200.         email_ = "";  
  1201.         bitField0_ = (bitField0_ & ~0x00000004);  
  1202.         if (phoneBuilder_ == null) {  
  1203.           phone_ = java.util.Collections.emptyList();  
  1204.           bitField0_ = (bitField0_ & ~0x00000008);  
  1205.         } else {  
  1206.           phoneBuilder_.clear();  
  1207.         }  
  1208.         return this;  
  1209.       }  
  1210.   
  1211.       public Builder clone() {  
  1212.         return create().mergeFrom(buildPartial());  
  1213.       }  
  1214.   
  1215.       public com.google.protobuf.Descriptors.Descriptor  
  1216.           getDescriptorForType() {  
  1217.         return study.java.arithmetic.protobuf.AddressBookProtos.internal_static_tutorial_Person_descriptor;  
  1218.       }  
  1219.   
  1220.       public study.java.arithmetic.protobuf.AddressBookProtos.Person getDefaultInstanceForType() {  
  1221.         return study.java.arithmetic.protobuf.AddressBookProtos.Person.getDefaultInstance();  
  1222.       }  
  1223.   
  1224.       public study.java.arithmetic.protobuf.AddressBookProtos.Person build() {  
  1225.         study.java.arithmetic.protobuf.AddressBookProtos.Person result = buildPartial();  
  1226.         if (!result.isInitialized()) {  
  1227.           throw newUninitializedMessageException(result);  
  1228.         }  
  1229.         return result;  
  1230.       }  
  1231.   
  1232.       public study.java.arithmetic.protobuf.AddressBookProtos.Person buildPartial() {  
  1233.         study.java.arithmetic.protobuf.AddressBookProtos.Person result = new study.java.arithmetic.protobuf.AddressBookProtos.Person(this);  
  1234.         int from_bitField0_ = bitField0_;  
  1235.         int to_bitField0_ = 0;  
  1236.         if (((from_bitField0_ & 0x00000001) == 0x00000001)) {  
  1237.           to_bitField0_ |= 0x00000001;  
  1238.         }  
  1239.         result.name_ = name_;  
  1240.         if (((from_bitField0_ & 0x00000002) == 0x00000002)) {  
  1241.           to_bitField0_ |= 0x00000002;  
  1242.         }  
  1243.         result.id_ = id_;  
  1244.         if (((from_bitField0_ & 0x00000004) == 0x00000004)) {  
  1245.           to_bitField0_ |= 0x00000004;  
  1246.         }  
  1247.         result.email_ = email_;  
  1248.         if (phoneBuilder_ == null) {  
  1249.           if (((bitField0_ & 0x00000008) == 0x00000008)) {  
  1250.             phone_ = java.util.Collections.unmodifiableList(phone_);  
  1251.             bitField0_ = (bitField0_ & ~0x00000008);  
  1252.           }  
  1253.           result.phone_ = phone_;  
  1254.         } else {  
  1255.           result.phone_ = phoneBuilder_.build();  
  1256.         }  
  1257.         result.bitField0_ = to_bitField0_;  
  1258.         onBuilt();  
  1259.         return result;  
  1260.       }  
  1261.   
  1262.       public Builder mergeFrom(com.google.protobuf.Message other) {  
  1263.         if (other instanceof study.java.arithmetic.protobuf.AddressBookProtos.Person) {  
  1264.           return mergeFrom((study.java.arithmetic.protobuf.AddressBookProtos.Person)other);  
  1265.         } else {  
  1266.           super.mergeFrom(other);  
  1267.           return this;  
  1268.         }  
  1269.       }  
  1270.   
  1271.       public Builder mergeFrom(study.java.arithmetic.protobuf.AddressBookProtos.Person other) {  
  1272.         if (other == study.java.arithmetic.protobuf.AddressBookProtos.Person.getDefaultInstance()) return this;  
  1273.         if (other.hasName()) {  
  1274.           bitField0_ |= 0x00000001;  
  1275.           name_ = other.name_;  
  1276.           onChanged();  
  1277.         }  
  1278.         if (other.hasId()) {  
  1279.           setId(other.getId());  
  1280.         }  
  1281.         if (other.hasEmail()) {  
  1282.           bitField0_ |= 0x00000004;  
  1283.           email_ = other.email_;  
  1284.           onChanged();  
  1285.         }  
  1286.         if (phoneBuilder_ == null) {  
  1287.           if (!other.phone_.isEmpty()) {  
  1288.             if (phone_.isEmpty()) {  
  1289.               phone_ = other.phone_;  
  1290.               bitField0_ = (bitField0_ & ~0x00000008);  
  1291.             } else {  
  1292.               ensurePhoneIsMutable();  
  1293.               phone_.addAll(other.phone_);  
  1294.             }  
  1295.             onChanged();  
  1296.           }  
  1297.         } else {  
  1298.           if (!other.phone_.isEmpty()) {  
  1299.             if (phoneBuilder_.isEmpty()) {  
  1300.               phoneBuilder_.dispose();  
  1301.               phoneBuilder_ = null;  
  1302.               phone_ = other.phone_;  
  1303.               bitField0_ = (bitField0_ & ~0x00000008);  
  1304.               phoneBuilder_ =   
  1305.                 com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?  
  1306.                    getPhoneFieldBuilder() : null;  
  1307.             } else {  
  1308.               phoneBuilder_.addAllMessages(other.phone_);  
  1309.             }  
  1310.           }  
  1311.         }  
  1312.         this.mergeUnknownFields(other.getUnknownFields());  
  1313.         return this;  
  1314.       }  
  1315.   
  1316.       public final boolean isInitialized() {  
  1317.         if (!hasName()) {  
  1318.             
  1319.           return false;  
  1320.         }  
  1321.         if (!hasId()) {  
  1322.             
  1323.           return false;  
  1324.         }  
  1325.         for (int i = 0; i < getPhoneCount(); i++) {  
  1326.           if (!getPhone(i).isInitialized()) {  
  1327.               
  1328.             return false;  
  1329.           }  
  1330.         }  
  1331.         return true;  
  1332.       }  
  1333.   
  1334.       public Builder mergeFrom(  
  1335.           com.google.protobuf.CodedInputStream input,  
  1336.           com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  1337.           throws java.io.IOException {  
  1338.         study.java.arithmetic.protobuf.AddressBookProtos.Person parsedMessage = null;  
  1339.         try {  
  1340.           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);  
  1341.         } catch (com.google.protobuf.InvalidProtocolBufferException e) {  
  1342.           parsedMessage = (study.java.arithmetic.protobuf.AddressBookProtos.Person) e.getUnfinishedMessage();  
  1343.           throw e;  
  1344.         } finally {  
  1345.           if (parsedMessage != null) {  
  1346.             mergeFrom(parsedMessage);  
  1347.           }  
  1348.         }  
  1349.         return this;  
  1350.       }  
  1351.       private int bitField0_;  
  1352.   
  1353.       // required string name = 1;  
  1354.       private java.lang.Object name_ = "";  
  1355.       /** 
  1356.        * <code>required string name = 1;</code> 
  1357.        */  
  1358.       public boolean hasName() {  
  1359.         return ((bitField0_ & 0x00000001) == 0x00000001);  
  1360.       }  
  1361.       /** 
  1362.        * <code>required string name = 1;</code> 
  1363.        */  
  1364.       public java.lang.String getName() {  
  1365.         java.lang.Object ref = name_;  
  1366.         if (!(ref instanceof java.lang.String)) {  
  1367.           java.lang.String s = ((com.google.protobuf.ByteString) ref)  
  1368.               .toStringUtf8();  
  1369.           name_ = s;  
  1370.           return s;  
  1371.         } else {  
  1372.           return (java.lang.String) ref;  
  1373.         }  
  1374.       }  
  1375.       /** 
  1376.        * <code>required string name = 1;</code> 
  1377.        */  
  1378.       public com.google.protobuf.ByteString  
  1379.           getNameBytes() {  
  1380.         java.lang.Object ref = name_;  
  1381.         if (ref instanceof String) {  
  1382.           com.google.protobuf.ByteString b =   
  1383.               com.google.protobuf.ByteString.copyFromUtf8(  
  1384.                   (java.lang.String) ref);  
  1385.           name_ = b;  
  1386.           return b;  
  1387.         } else {  
  1388.           return (com.google.protobuf.ByteString) ref;  
  1389.         }  
  1390.       }  
  1391.       /** 
  1392.        * <code>required string name = 1;</code> 
  1393.        */  
  1394.       public Builder setName(  
  1395.           java.lang.String value) {  
  1396.         if (value == null) {  
  1397.     throw new NullPointerException();  
  1398.   }  
  1399.   bitField0_ |= 0x00000001;  
  1400.         name_ = value;  
  1401.         onChanged();  
  1402.         return this;  
  1403.       }  
  1404.       /** 
  1405.        * <code>required string name = 1;</code> 
  1406.        */  
  1407.       public Builder clearName() {  
  1408.         bitField0_ = (bitField0_ & ~0x00000001);  
  1409.         name_ = getDefaultInstance().getName();  
  1410.         onChanged();  
  1411.         return this;  
  1412.       }  
  1413.       /** 
  1414.        * <code>required string name = 1;</code> 
  1415.        */  
  1416.       public Builder setNameBytes(  
  1417.           com.google.protobuf.ByteString value) {  
  1418.         if (value == null) {  
  1419.     throw new NullPointerException();  
  1420.   }  
  1421.   bitField0_ |= 0x00000001;  
  1422.         name_ = value;  
  1423.         onChanged();  
  1424.         return this;  
  1425.       }  
  1426.   
  1427.       // required int32 id = 2;  
  1428.       private int id_ ;  
  1429.       /** 
  1430.        * <code>required int32 id = 2;</code> 
  1431.        * 
  1432.        * <pre> 
  1433.        * Unique ID number for this person.   
  1434.        * </pre> 
  1435.        */  
  1436.       public boolean hasId() {  
  1437.         return ((bitField0_ & 0x00000002) == 0x00000002);  
  1438.       }  
  1439.       /** 
  1440.        * <code>required int32 id = 2;</code> 
  1441.        * 
  1442.        * <pre> 
  1443.        * Unique ID number for this person.   
  1444.        * </pre> 
  1445.        */  
  1446.       public int getId() {  
  1447.         return id_;  
  1448.       }  
  1449.       /** 
  1450.        * <code>required int32 id = 2;</code> 
  1451.        * 
  1452.        * <pre> 
  1453.        * Unique ID number for this person.   
  1454.        * </pre> 
  1455.        */  
  1456.       public Builder setId(int value) {  
  1457.         bitField0_ |= 0x00000002;  
  1458.         id_ = value;  
  1459.         onChanged();  
  1460.         return this;  
  1461.       }  
  1462.       /** 
  1463.        * <code>required int32 id = 2;</code> 
  1464.        * 
  1465.        * <pre> 
  1466.        * Unique ID number for this person.   
  1467.        * </pre> 
  1468.        */  
  1469.       public Builder clearId() {  
  1470.         bitField0_ = (bitField0_ & ~0x00000002);  
  1471.         id_ = 0;  
  1472.         onChanged();  
  1473.         return this;  
  1474.       }  
  1475.   
  1476.       // optional string email = 3;  
  1477.       private java.lang.Object email_ = "";  
  1478.       /** 
  1479.        * <code>optional string email = 3;</code> 
  1480.        */  
  1481.       public boolean hasEmail() {  
  1482.         return ((bitField0_ & 0x00000004) == 0x00000004);  
  1483.       }  
  1484.       /** 
  1485.        * <code>optional string email = 3;</code> 
  1486.        */  
  1487.       public java.lang.String getEmail() {  
  1488.         java.lang.Object ref = email_;  
  1489.         if (!(ref instanceof java.lang.String)) {  
  1490.           java.lang.String s = ((com.google.protobuf.ByteString) ref)  
  1491.               .toStringUtf8();  
  1492.           email_ = s;  
  1493.           return s;  
  1494.         } else {  
  1495.           return (java.lang.String) ref;  
  1496.         }  
  1497.       }  
  1498.       /** 
  1499.        * <code>optional string email = 3;</code> 
  1500.        */  
  1501.       public com.google.protobuf.ByteString  
  1502.           getEmailBytes() {  
  1503.         java.lang.Object ref = email_;  
  1504.         if (ref instanceof String) {  
  1505.           com.google.protobuf.ByteString b =   
  1506.               com.google.protobuf.ByteString.copyFromUtf8(  
  1507.                   (java.lang.String) ref);  
  1508.           email_ = b;  
  1509.           return b;  
  1510.         } else {  
  1511.           return (com.google.protobuf.ByteString) ref;  
  1512.         }  
  1513.       }  
  1514.       /** 
  1515.        * <code>optional string email = 3;</code> 
  1516.        */  
  1517.       public Builder setEmail(  
  1518.           java.lang.String value) {  
  1519.         if (value == null) {  
  1520.     throw new NullPointerException();  
  1521.   }  
  1522.   bitField0_ |= 0x00000004;  
  1523.         email_ = value;  
  1524.         onChanged();  
  1525.         return this;  
  1526.       }  
  1527.       /** 
  1528.        * <code>optional string email = 3;</code> 
  1529.        */  
  1530.       public Builder clearEmail() {  
  1531.         bitField0_ = (bitField0_ & ~0x00000004);  
  1532.         email_ = getDefaultInstance().getEmail();  
  1533.         onChanged();  
  1534.         return this;  
  1535.       }  
  1536.       /** 
  1537.        * <code>optional string email = 3;</code> 
  1538.        */  
  1539.       public Builder setEmailBytes(  
  1540.           com.google.protobuf.ByteString value) {  
  1541.         if (value == null) {  
  1542.     throw new NullPointerException();  
  1543.   }  
  1544.   bitField0_ |= 0x00000004;  
  1545.         email_ = value;  
  1546.         onChanged();  
  1547.         return this;  
  1548.       }  
  1549.   
  1550.       // repeated .tutorial.Person.PhoneNumber phone = 4;  
  1551.       private java.util.List<study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber> phone_ =  
  1552.         java.util.Collections.emptyList();  
  1553.       private void ensurePhoneIsMutable() {  
  1554.         if (!((bitField0_ & 0x00000008) == 0x00000008)) {  
  1555.           phone_ = new java.util.ArrayList<study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber>(phone_);  
  1556.           bitField0_ |= 0x00000008;  
  1557.          }  
  1558.       }  
  1559.   
  1560.       private com.google.protobuf.RepeatedFieldBuilder<  
  1561.           study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber, study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.Builder, study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumberOrBuilder> phoneBuilder_;  
  1562.   
  1563.       /** 
  1564.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1565.        */  
  1566.       public java.util.List<study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber> getPhoneList() {  
  1567.         if (phoneBuilder_ == null) {  
  1568.           return java.util.Collections.unmodifiableList(phone_);  
  1569.         } else {  
  1570.           return phoneBuilder_.getMessageList();  
  1571.         }  
  1572.       }  
  1573.       /** 
  1574.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1575.        */  
  1576.       public int getPhoneCount() {  
  1577.         if (phoneBuilder_ == null) {  
  1578.           return phone_.size();  
  1579.         } else {  
  1580.           return phoneBuilder_.getCount();  
  1581.         }  
  1582.       }  
  1583.       /** 
  1584.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1585.        */  
  1586.       public study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber getPhone(int index) {  
  1587.         if (phoneBuilder_ == null) {  
  1588.           return phone_.get(index);  
  1589.         } else {  
  1590.           return phoneBuilder_.getMessage(index);  
  1591.         }  
  1592.       }  
  1593.       /** 
  1594.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1595.        */  
  1596.       public Builder setPhone(  
  1597.           int index, study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber value) {  
  1598.         if (phoneBuilder_ == null) {  
  1599.           if (value == null) {  
  1600.             throw new NullPointerException();  
  1601.           }  
  1602.           ensurePhoneIsMutable();  
  1603.           phone_.set(index, value);  
  1604.           onChanged();  
  1605.         } else {  
  1606.           phoneBuilder_.setMessage(index, value);  
  1607.         }  
  1608.         return this;  
  1609.       }  
  1610.       /** 
  1611.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1612.        */  
  1613.       public Builder setPhone(  
  1614.           int index, study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.Builder builderForValue) {  
  1615.         if (phoneBuilder_ == null) {  
  1616.           ensurePhoneIsMutable();  
  1617.           phone_.set(index, builderForValue.build());  
  1618.           onChanged();  
  1619.         } else {  
  1620.           phoneBuilder_.setMessage(index, builderForValue.build());  
  1621.         }  
  1622.         return this;  
  1623.       }  
  1624.       /** 
  1625.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1626.        */  
  1627.       public Builder addPhone(study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber value) {  
  1628.         if (phoneBuilder_ == null) {  
  1629.           if (value == null) {  
  1630.             throw new NullPointerException();  
  1631.           }  
  1632.           ensurePhoneIsMutable();  
  1633.           phone_.add(value);  
  1634.           onChanged();  
  1635.         } else {  
  1636.           phoneBuilder_.addMessage(value);  
  1637.         }  
  1638.         return this;  
  1639.       }  
  1640.       /** 
  1641.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1642.        */  
  1643.       public Builder addPhone(  
  1644.           int index, study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber value) {  
  1645.         if (phoneBuilder_ == null) {  
  1646.           if (value == null) {  
  1647.             throw new NullPointerException();  
  1648.           }  
  1649.           ensurePhoneIsMutable();  
  1650.           phone_.add(index, value);  
  1651.           onChanged();  
  1652.         } else {  
  1653.           phoneBuilder_.addMessage(index, value);  
  1654.         }  
  1655.         return this;  
  1656.       }  
  1657.       /** 
  1658.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1659.        */  
  1660.       public Builder addPhone(  
  1661.           study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.Builder builderForValue) {  
  1662.         if (phoneBuilder_ == null) {  
  1663.           ensurePhoneIsMutable();  
  1664.           phone_.add(builderForValue.build());  
  1665.           onChanged();  
  1666.         } else {  
  1667.           phoneBuilder_.addMessage(builderForValue.build());  
  1668.         }  
  1669.         return this;  
  1670.       }  
  1671.       /** 
  1672.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1673.        */  
  1674.       public Builder addPhone(  
  1675.           int index, study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.Builder builderForValue) {  
  1676.         if (phoneBuilder_ == null) {  
  1677.           ensurePhoneIsMutable();  
  1678.           phone_.add(index, builderForValue.build());  
  1679.           onChanged();  
  1680.         } else {  
  1681.           phoneBuilder_.addMessage(index, builderForValue.build());  
  1682.         }  
  1683.         return this;  
  1684.       }  
  1685.       /** 
  1686.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1687.        */  
  1688.       public Builder addAllPhone(  
  1689.           java.lang.Iterable<? extends study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber> values) {  
  1690.         if (phoneBuilder_ == null) {  
  1691.           ensurePhoneIsMutable();  
  1692.           super.addAll(values, phone_);  
  1693.           onChanged();  
  1694.         } else {  
  1695.           phoneBuilder_.addAllMessages(values);  
  1696.         }  
  1697.         return this;  
  1698.       }  
  1699.       /** 
  1700.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1701.        */  
  1702.       public Builder clearPhone() {  
  1703.         if (phoneBuilder_ == null) {  
  1704.           phone_ = java.util.Collections.emptyList();  
  1705.           bitField0_ = (bitField0_ & ~0x00000008);  
  1706.           onChanged();  
  1707.         } else {  
  1708.           phoneBuilder_.clear();  
  1709.         }  
  1710.         return this;  
  1711.       }  
  1712.       /** 
  1713.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1714.        */  
  1715.       public Builder removePhone(int index) {  
  1716.         if (phoneBuilder_ == null) {  
  1717.           ensurePhoneIsMutable();  
  1718.           phone_.remove(index);  
  1719.           onChanged();  
  1720.         } else {  
  1721.           phoneBuilder_.remove(index);  
  1722.         }  
  1723.         return this;  
  1724.       }  
  1725.       /** 
  1726.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1727.        */  
  1728.       public study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.Builder getPhoneBuilder(  
  1729.           int index) {  
  1730.         return getPhoneFieldBuilder().getBuilder(index);  
  1731.       }  
  1732.       /** 
  1733.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1734.        */  
  1735.       public study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumberOrBuilder getPhoneOrBuilder(  
  1736.           int index) {  
  1737.         if (phoneBuilder_ == null) {  
  1738.           return phone_.get(index);  } else {  
  1739.           return phoneBuilder_.getMessageOrBuilder(index);  
  1740.         }  
  1741.       }  
  1742.       /** 
  1743.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1744.        */  
  1745.       public java.util.List<? extends study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumberOrBuilder>   
  1746.            getPhoneOrBuilderList() {  
  1747.         if (phoneBuilder_ != null) {  
  1748.           return phoneBuilder_.getMessageOrBuilderList();  
  1749.         } else {  
  1750.           return java.util.Collections.unmodifiableList(phone_);  
  1751.         }  
  1752.       }  
  1753.       /** 
  1754.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1755.        */  
  1756.       public study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.Builder addPhoneBuilder() {  
  1757.         return getPhoneFieldBuilder().addBuilder(  
  1758.             study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.getDefaultInstance());  
  1759.       }  
  1760.       /** 
  1761.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1762.        */  
  1763.       public study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.Builder addPhoneBuilder(  
  1764.           int index) {  
  1765.         return getPhoneFieldBuilder().addBuilder(  
  1766.             index, study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.getDefaultInstance());  
  1767.       }  
  1768.       /** 
  1769.        * <code>repeated .tutorial.Person.PhoneNumber phone = 4;</code> 
  1770.        */  
  1771.       public java.util.List<study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.Builder>   
  1772.            getPhoneBuilderList() {  
  1773.         return getPhoneFieldBuilder().getBuilderList();  
  1774.       }  
  1775.       private com.google.protobuf.RepeatedFieldBuilder<  
  1776.           study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber, study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.Builder, study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumberOrBuilder>   
  1777.           getPhoneFieldBuilder() {  
  1778.         if (phoneBuilder_ == null) {  
  1779.           phoneBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<  
  1780.               study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber, study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumber.Builder, study.java.arithmetic.protobuf.AddressBookProtos.Person.PhoneNumberOrBuilder>(  
  1781.                   phone_,  
  1782.                   ((bitField0_ & 0x00000008) == 0x00000008),  
  1783.                   getParentForChildren(),  
  1784.                   isClean());  
  1785.           phone_ = null;  
  1786.         }  
  1787.         return phoneBuilder_;  
  1788.       }  
  1789.   
  1790.       // @@protoc_insertion_point(builder_scope:tutorial.Person)  
  1791.     }  
  1792.   
  1793.     static {  
  1794.       defaultInstance = new Person(true);  
  1795.       defaultInstance.initFields();  
  1796.     }  
  1797.   
  1798.     // @@protoc_insertion_point(class_scope:tutorial.Person)  
  1799.   }  
  1800.   
  1801.   public interface AddressBookOrBuilder  
  1802.       extends com.google.protobuf.MessageOrBuilder {  
  1803.   
  1804.     // repeated .tutorial.Person person = 1;  
  1805.     /** 
  1806.      * <code>repeated .tutorial.Person person = 1;</code> 
  1807.      */  
  1808.     java.util.List<study.java.arithmetic.protobuf.AddressBookProtos.Person>   
  1809.         getPersonList();  
  1810.     /** 
  1811.      * <code>repeated .tutorial.Person person = 1;</code> 
  1812.      */  
  1813.     study.java.arithmetic.protobuf.AddressBookProtos.Person getPerson(int index);  
  1814.     /** 
  1815.      * <code>repeated .tutorial.Person person = 1;</code> 
  1816.      */  
  1817.     int getPersonCount();  
  1818.     /** 
  1819.      * <code>repeated .tutorial.Person person = 1;</code> 
  1820.      */  
  1821.     java.util.List<? extends study.java.arithmetic.protobuf.AddressBookProtos.PersonOrBuilder>   
  1822.         getPersonOrBuilderList();  
  1823.     /** 
  1824.      * <code>repeated .tutorial.Person person = 1;</code> 
  1825.      */  
  1826.     study.java.arithmetic.protobuf.AddressBookProtos.PersonOrBuilder getPersonOrBuilder(  
  1827.         int index);  
  1828.   }  
  1829.   /** 
  1830.    * Protobuf type {@code tutorial.AddressBook} 
  1831.    * 
  1832.    * <pre> 
  1833.    * Our address book file is just one of these.   
  1834.    * </pre> 
  1835.    */  
  1836.   public static final class AddressBook extends  
  1837.       com.google.protobuf.GeneratedMessage  
  1838.       implements AddressBookOrBuilder {  
  1839.     // Use AddressBook.newBuilder() to construct.  
  1840.     private AddressBook(com.google.protobuf.GeneratedMessage.Builder<?> builder) {  
  1841.       super(builder);  
  1842.       this.unknownFields = builder.getUnknownFields();  
  1843.     }  
  1844.     private AddressBook(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }  
  1845.   
  1846.     private static final AddressBook defaultInstance;  
  1847.     public static AddressBook getDefaultInstance() {  
  1848.       return defaultInstance;  
  1849.     }  
  1850.   
  1851.     public AddressBook getDefaultInstanceForType() {  
  1852.       return defaultInstance;  
  1853.     }  
  1854.   
  1855.     private final com.google.protobuf.UnknownFieldSet unknownFields;  
  1856.     @java.lang.Override  
  1857.     public final com.google.protobuf.UnknownFieldSet  
  1858.         getUnknownFields() {  
  1859.       return this.unknownFields;  
  1860.     }  
  1861.     private AddressBook(  
  1862.         com.google.protobuf.CodedInputStream input,  
  1863.         com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  1864.         throws com.google.protobuf.InvalidProtocolBufferException {  
  1865.       initFields();  
  1866.       int mutable_bitField0_ = 0;  
  1867.       com.google.protobuf.UnknownFieldSet.Builder unknownFields =  
  1868.           com.google.protobuf.UnknownFieldSet.newBuilder();  
  1869.       try {  
  1870.         boolean done = false;  
  1871.         while (!done) {  
  1872.           int tag = input.readTag();  
  1873.           switch (tag) {  
  1874.             case 0:  
  1875.               done = true;  
  1876.               break;  
  1877.             default: {  
  1878.               if (!parseUnknownField(input, unknownFields,  
  1879.                                      extensionRegistry, tag)) {  
  1880.                 done = true;  
  1881.               }  
  1882.               break;  
  1883.             }  
  1884.             case 10: {  
  1885.               if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) {  
  1886.                 person_ = new java.util.ArrayList<study.java.arithmetic.protobuf.AddressBookProtos.Person>();  
  1887.                 mutable_bitField0_ |= 0x00000001;  
  1888.               }  
  1889.               person_.add(input.readMessage(study.java.arithmetic.protobuf.AddressBookProtos.Person.PARSER, extensionRegistry));  
  1890.               break;  
  1891.             }  
  1892.           }  
  1893.         }  
  1894.       } catch (com.google.protobuf.InvalidProtocolBufferException e) {  
  1895.         throw e.setUnfinishedMessage(this);  
  1896.       } catch (java.io.IOException e) {  
  1897.         throw new com.google.protobuf.InvalidProtocolBufferException(  
  1898.             e.getMessage()).setUnfinishedMessage(this);  
  1899.       } finally {  
  1900.         if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {  
  1901.           person_ = java.util.Collections.unmodifiableList(person_);  
  1902.         }  
  1903.         this.unknownFields = unknownFields.build();  
  1904.         makeExtensionsImmutable();  
  1905.       }  
  1906.     }  
  1907.     public static final com.google.protobuf.Descriptors.Descriptor  
  1908.         getDescriptor() {  
  1909.       return study.java.arithmetic.protobuf.AddressBookProtos.internal_static_tutorial_AddressBook_descriptor;  
  1910.     }  
  1911.   
  1912.     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable  
  1913.         internalGetFieldAccessorTable() {  
  1914.       return study.java.arithmetic.protobuf.AddressBookProtos.internal_static_tutorial_AddressBook_fieldAccessorTable  
  1915.           .ensureFieldAccessorsInitialized(  
  1916.               study.java.arithmetic.protobuf.AddressBookProtos.AddressBook.class, study.java.arithmetic.protobuf.AddressBookProtos.AddressBook.Builder.class);  
  1917.     }  
  1918.   
  1919.     public static com.google.protobuf.Parser<AddressBook> PARSER =  
  1920.         new com.google.protobuf.AbstractParser<AddressBook>() {  
  1921.       public AddressBook parsePartialFrom(  
  1922.           com.google.protobuf.CodedInputStream input,  
  1923.           com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  1924.           throws com.google.protobuf.InvalidProtocolBufferException {  
  1925.         return new AddressBook(input, extensionRegistry);  
  1926.       }  
  1927.     };  
  1928.   
  1929.     @java.lang.Override  
  1930.     public com.google.protobuf.Parser<AddressBook> getParserForType() {  
  1931.       return PARSER;  
  1932.     }  
  1933.   
  1934.     // repeated .tutorial.Person person = 1;  
  1935.     public static final int PERSON_FIELD_NUMBER = 1;  
  1936.     private java.util.List<study.java.arithmetic.protobuf.AddressBookProtos.Person> person_;  
  1937.     /** 
  1938.      * <code>repeated .tutorial.Person person = 1;</code> 
  1939.      */  
  1940.     public java.util.List<study.java.arithmetic.protobuf.AddressBookProtos.Person> getPersonList() {  
  1941.       return person_;  
  1942.     }  
  1943.     /** 
  1944.      * <code>repeated .tutorial.Person person = 1;</code> 
  1945.      */  
  1946.     public java.util.List<? extends study.java.arithmetic.protobuf.AddressBookProtos.PersonOrBuilder>   
  1947.         getPersonOrBuilderList() {  
  1948.       return person_;  
  1949.     }  
  1950.     /** 
  1951.      * <code>repeated .tutorial.Person person = 1;</code> 
  1952.      */  
  1953.     public int getPersonCount() {  
  1954.       return person_.size();  
  1955.     }  
  1956.     /** 
  1957.      * <code>repeated .tutorial.Person person = 1;</code> 
  1958.      */  
  1959.     public study.java.arithmetic.protobuf.AddressBookProtos.Person getPerson(int index) {  
  1960.       return person_.get(index);  
  1961.     }  
  1962.     /** 
  1963.      * <code>repeated .tutorial.Person person = 1;</code> 
  1964.      */  
  1965.     public study.java.arithmetic.protobuf.AddressBookProtos.PersonOrBuilder getPersonOrBuilder(  
  1966.         int index) {  
  1967.       return person_.get(index);  
  1968.     }  
  1969.   
  1970.     private void initFields() {  
  1971.       person_ = java.util.Collections.emptyList();  
  1972.     }  
  1973.     private byte memoizedIsInitialized = -1;  
  1974.     public final boolean isInitialized() {  
  1975.       byte isInitialized = memoizedIsInitialized;  
  1976.       if (isInitialized != -1return isInitialized == 1;  
  1977.   
  1978.       for (int i = 0; i < getPersonCount(); i++) {  
  1979.         if (!getPerson(i).isInitialized()) {  
  1980.           memoizedIsInitialized = 0;  
  1981.           return false;  
  1982.         }  
  1983.       }  
  1984.       memoizedIsInitialized = 1;  
  1985.       return true;  
  1986.     }  
  1987.   
  1988.     public void writeTo(com.google.protobuf.CodedOutputStream output)  
  1989.                         throws java.io.IOException {  
  1990.       getSerializedSize();  
  1991.       for (int i = 0; i < person_.size(); i++) {  
  1992.         output.writeMessage(1, person_.get(i));  
  1993.       }  
  1994.       getUnknownFields().writeTo(output);  
  1995.     }  
  1996.   
  1997.     private int memoizedSerializedSize = -1;  
  1998.     public int getSerializedSize() {  
  1999.       int size = memoizedSerializedSize;  
  2000.       if (size != -1return size;  
  2001.   
  2002.       size = 0;  
  2003.       for (int i = 0; i < person_.size(); i++) {  
  2004.         size += com.google.protobuf.CodedOutputStream  
  2005.           .computeMessageSize(1, person_.get(i));  
  2006.       }  
  2007.       size += getUnknownFields().getSerializedSize();  
  2008.       memoizedSerializedSize = size;  
  2009.       return size;  
  2010.     }  
  2011.   
  2012.     private static final long serialVersionUID = 0L;  
  2013.     @java.lang.Override  
  2014.     protected java.lang.Object writeReplace()  
  2015.         throws java.io.ObjectStreamException {  
  2016.       return super.writeReplace();  
  2017.     }  
  2018.   
  2019.     public static study.java.arithmetic.protobuf.AddressBookProtos.AddressBook parseFrom(  
  2020.         com.google.protobuf.ByteString data)  
  2021.         throws com.google.protobuf.InvalidProtocolBufferException {  
  2022.       return PARSER.parseFrom(data);  
  2023.     }  
  2024.     public static study.java.arithmetic.protobuf.AddressBookProtos.AddressBook parseFrom(  
  2025.         com.google.protobuf.ByteString data,  
  2026.         com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  2027.         throws com.google.protobuf.InvalidProtocolBufferException {  
  2028.       return PARSER.parseFrom(data, extensionRegistry);  
  2029.     }  
  2030.     public static study.java.arithmetic.protobuf.AddressBookProtos.AddressBook parseFrom(byte[] data)  
  2031.         throws com.google.protobuf.InvalidProtocolBufferException {  
  2032.       return PARSER.parseFrom(data);  
  2033.     }  
  2034.     public static study.java.arithmetic.protobuf.AddressBookProtos.AddressBook parseFrom(  
  2035.         byte[] data,  
  2036.         com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  2037.         throws com.google.protobuf.InvalidProtocolBufferException {  
  2038.       return PARSER.parseFrom(data, extensionRegistry);  
  2039.     }  
  2040.     public static study.java.arithmetic.protobuf.AddressBookProtos.AddressBook parseFrom(java.io.InputStream input)  
  2041.         throws java.io.IOException {  
  2042.       return PARSER.parseFrom(input);  
  2043.     }  
  2044.     public static study.java.arithmetic.protobuf.AddressBookProtos.AddressBook parseFrom(  
  2045.         java.io.InputStream input,  
  2046.         com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  2047.         throws java.io.IOException {  
  2048.       return PARSER.parseFrom(input, extensionRegistry);  
  2049.     }  
  2050.     public static study.java.arithmetic.protobuf.AddressBookProtos.AddressBook parseDelimitedFrom(java.io.InputStream input)  
  2051.         throws java.io.IOException {  
  2052.       return PARSER.parseDelimitedFrom(input);  
  2053.     }  
  2054.     public static study.java.arithmetic.protobuf.AddressBookProtos.AddressBook parseDelimitedFrom(  
  2055.         java.io.InputStream input,  
  2056.         com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  2057.         throws java.io.IOException {  
  2058.       return PARSER.parseDelimitedFrom(input, extensionRegistry);  
  2059.     }  
  2060.     public static study.java.arithmetic.protobuf.AddressBookProtos.AddressBook parseFrom(  
  2061.         com.google.protobuf.CodedInputStream input)  
  2062.         throws java.io.IOException {  
  2063.       return PARSER.parseFrom(input);  
  2064.     }  
  2065.     public static study.java.arithmetic.protobuf.AddressBookProtos.AddressBook parseFrom(  
  2066.         com.google.protobuf.CodedInputStream input,  
  2067.         com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  2068.         throws java.io.IOException {  
  2069.       return PARSER.parseFrom(input, extensionRegistry);  
  2070.     }  
  2071.   
  2072.     public static Builder newBuilder() { return Builder.create(); }  
  2073.     public Builder newBuilderForType() { return newBuilder(); }  
  2074.     public static Builder newBuilder(study.java.arithmetic.protobuf.AddressBookProtos.AddressBook prototype) {  
  2075.       return newBuilder().mergeFrom(prototype);  
  2076.     }  
  2077.     public Builder toBuilder() { return newBuilder(this); }  
  2078.   
  2079.     @java.lang.Override  
  2080.     protected Builder newBuilderForType(  
  2081.         com.google.protobuf.GeneratedMessage.BuilderParent parent) {  
  2082.       Builder builder = new Builder(parent);  
  2083.       return builder;  
  2084.     }  
  2085.     /** 
  2086.      * Protobuf type {@code tutorial.AddressBook} 
  2087.      * 
  2088.      * <pre> 
  2089.      * Our address book file is just one of these.   
  2090.      * </pre> 
  2091.      */  
  2092.     public static final class Builder extends  
  2093.         com.google.protobuf.GeneratedMessage.Builder<Builder>  
  2094.        implements study.java.arithmetic.protobuf.AddressBookProtos.AddressBookOrBuilder {  
  2095.       public static final com.google.protobuf.Descriptors.Descriptor  
  2096.           getDescriptor() {  
  2097.         return study.java.arithmetic.protobuf.AddressBookProtos.internal_static_tutorial_AddressBook_descriptor;  
  2098.       }  
  2099.   
  2100.       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable  
  2101.           internalGetFieldAccessorTable() {  
  2102.         return study.java.arithmetic.protobuf.AddressBookProtos.internal_static_tutorial_AddressBook_fieldAccessorTable  
  2103.             .ensureFieldAccessorsInitialized(  
  2104.                 study.java.arithmetic.protobuf.AddressBookProtos.AddressBook.class, study.java.arithmetic.protobuf.AddressBookProtos.AddressBook.Builder.class);  
  2105.       }  
  2106.   
  2107.       // Construct using study.java.arithmetic.protobuf.AddressBookProtos.AddressBook.newBuilder()  
  2108.       private Builder() {  
  2109.         maybeForceBuilderInitialization();  
  2110.       }  
  2111.   
  2112.       private Builder(  
  2113.           com.google.protobuf.GeneratedMessage.BuilderParent parent) {  
  2114.         super(parent);  
  2115.         maybeForceBuilderInitialization();  
  2116.       }  
  2117.       private void maybeForceBuilderInitialization() {  
  2118.         if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {  
  2119.           getPersonFieldBuilder();  
  2120.         }  
  2121.       }  
  2122.       private static Builder create() {  
  2123.         return new Builder();  
  2124.       }  
  2125.   
  2126.       public Builder clear() {  
  2127.         super.clear();  
  2128.         if (personBuilder_ == null) {  
  2129.           person_ = java.util.Collections.emptyList();  
  2130.           bitField0_ = (bitField0_ & ~0x00000001);  
  2131.         } else {  
  2132.           personBuilder_.clear();  
  2133.         }  
  2134.         return this;  
  2135.       }  
  2136.   
  2137.       public Builder clone() {  
  2138.         return create().mergeFrom(buildPartial());  
  2139.       }  
  2140.   
  2141.       public com.google.protobuf.Descriptors.Descriptor  
  2142.           getDescriptorForType() {  
  2143.         return study.java.arithmetic.protobuf.AddressBookProtos.internal_static_tutorial_AddressBook_descriptor;  
  2144.       }  
  2145.   
  2146.       public study.java.arithmetic.protobuf.AddressBookProtos.AddressBook getDefaultInstanceForType() {  
  2147.         return study.java.arithmetic.protobuf.AddressBookProtos.AddressBook.getDefaultInstance();  
  2148.       }  
  2149.   
  2150.       public study.java.arithmetic.protobuf.AddressBookProtos.AddressBook build() {  
  2151.         study.java.arithmetic.protobuf.AddressBookProtos.AddressBook result = buildPartial();  
  2152.         if (!result.isInitialized()) {  
  2153.           throw newUninitializedMessageException(result);  
  2154.         }  
  2155.         return result;  
  2156.       }  
  2157.   
  2158.       public study.java.arithmetic.protobuf.AddressBookProtos.AddressBook buildPartial() {  
  2159.         study.java.arithmetic.protobuf.AddressBookProtos.AddressBook result = new study.java.arithmetic.protobuf.AddressBookProtos.AddressBook(this);  
  2160.         int from_bitField0_ = bitField0_;  
  2161.         if (personBuilder_ == null) {  
  2162.           if (((bitField0_ & 0x00000001) == 0x00000001)) {  
  2163.             person_ = java.util.Collections.unmodifiableList(person_);  
  2164.             bitField0_ = (bitField0_ & ~0x00000001);  
  2165.           }  
  2166.           result.person_ = person_;  
  2167.         } else {  
  2168.           result.person_ = personBuilder_.build();  
  2169.         }  
  2170.         onBuilt();  
  2171.         return result;  
  2172.       }  
  2173.   
  2174.       public Builder mergeFrom(com.google.protobuf.Message other) {  
  2175.         if (other instanceof study.java.arithmetic.protobuf.AddressBookProtos.AddressBook) {  
  2176.           return mergeFrom((study.java.arithmetic.protobuf.AddressBookProtos.AddressBook)other);  
  2177.         } else {  
  2178.           super.mergeFrom(other);  
  2179.           return this;  
  2180.         }  
  2181.       }  
  2182.   
  2183.       public Builder mergeFrom(study.java.arithmetic.protobuf.AddressBookProtos.AddressBook other) {  
  2184.         if (other == study.java.arithmetic.protobuf.AddressBookProtos.AddressBook.getDefaultInstance()) return this;  
  2185.         if (personBuilder_ == null) {  
  2186.           if (!other.person_.isEmpty()) {  
  2187.             if (person_.isEmpty()) {  
  2188.               person_ = other.person_;  
  2189.               bitField0_ = (bitField0_ & ~0x00000001);  
  2190.             } else {  
  2191.               ensurePersonIsMutable();  
  2192.               person_.addAll(other.person_);  
  2193.             }  
  2194.             onChanged();  
  2195.           }  
  2196.         } else {  
  2197.           if (!other.person_.isEmpty()) {  
  2198.             if (personBuilder_.isEmpty()) {  
  2199.               personBuilder_.dispose();  
  2200.               personBuilder_ = null;  
  2201.               person_ = other.person_;  
  2202.               bitField0_ = (bitField0_ & ~0x00000001);  
  2203.               personBuilder_ =   
  2204.                 com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?  
  2205.                    getPersonFieldBuilder() : null;  
  2206.             } else {  
  2207.               personBuilder_.addAllMessages(other.person_);  
  2208.             }  
  2209.           }  
  2210.         }  
  2211.         this.mergeUnknownFields(other.getUnknownFields());  
  2212.         return this;  
  2213.       }  
  2214.   
  2215.       public final boolean isInitialized() {  
  2216.         for (int i = 0; i < getPersonCount(); i++) {  
  2217.           if (!getPerson(i).isInitialized()) {  
  2218.               
  2219.             return false;  
  2220.           }  
  2221.         }  
  2222.         return true;  
  2223.       }  
  2224.   
  2225.       public Builder mergeFrom(  
  2226.           com.google.protobuf.CodedInputStream input,  
  2227.           com.google.protobuf.ExtensionRegistryLite extensionRegistry)  
  2228.           throws java.io.IOException {  
  2229.         study.java.arithmetic.protobuf.AddressBookProtos.AddressBook parsedMessage = null;  
  2230.         try {  
  2231.           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);  
  2232.         } catch (com.google.protobuf.InvalidProtocolBufferException e) {  
  2233.           parsedMessage = (study.java.arithmetic.protobuf.AddressBookProtos.AddressBook) e.getUnfinishedMessage();  
  2234.           throw e;  
  2235.         } finally {  
  2236.           if (parsedMessage != null) {  
  2237.             mergeFrom(parsedMessage);  
  2238.           }  
  2239.         }  
  2240.         return this;  
  2241.       }  
  2242.       private int bitField0_;  
  2243.   
  2244.       // repeated .tutorial.Person person = 1;  
  2245.       private java.util.List<study.java.arithmetic.protobuf.AddressBookProtos.Person> person_ =  
  2246.         java.util.Collections.emptyList();  
  2247.       private void ensurePersonIsMutable() {  
  2248.         if (!((bitField0_ & 0x00000001) == 0x00000001)) {  
  2249.           person_ = new java.util.ArrayList<study.java.arithmetic.protobuf.AddressBookProtos.Person>(person_);  
  2250.           bitField0_ |= 0x00000001;  
  2251.          }  
  2252.       }  
  2253.   
  2254.       private com.google.protobuf.RepeatedFieldBuilder<  
  2255.           study.java.arithmetic.protobuf.AddressBookProtos.Person, study.java.arithmetic.protobuf.AddressBookProtos.Person.Builder, study.java.arithmetic.protobuf.AddressBookProtos.PersonOrBuilder> personBuilder_;  
  2256.   
  2257.       /** 
  2258.        * <code>repeated .tutorial.Person person = 1;</code> 
  2259.        */  
  2260.       public java.util.List<study.java.arithmetic.protobuf.AddressBookProtos.Person> getPersonList() {  
  2261.         if (personBuilder_ == null) {  
  2262.           return java.util.Collections.unmodifiableList(person_);  
  2263.         } else {  
  2264.           return personBuilder_.getMessageList();  
  2265.         }  
  2266.       }  
  2267.       /** 
  2268.        * <code>repeated .tutorial.Person person = 1;</code> 
  2269.        */  
  2270.       public int getPersonCount() {  
  2271.         if (personBuilder_ == null) {  
  2272.           return person_.size();  
  2273.         } else {  
  2274.           return personBuilder_.getCount();  
  2275.         }  
  2276.       }  
  2277.       /** 
  2278.        * <code>repeated .tutorial.Person person = 1;</code> 
  2279.        */  
  2280.       public study.java.arithmetic.protobuf.AddressBookProtos.Person getPerson(int index) {  
  2281.         if (personBuilder_ == null) {  
  2282.           return person_.get(index);  
  2283.         } else {  
  2284.           return personBuilder_.getMessage(index);  
  2285.         }  
  2286.       }  
  2287.       /** 
  2288.        * <code>repeated .tutorial.Person person = 1;</code> 
  2289.        */  
  2290.       public Builder setPerson(  
  2291.           int index, study.java.arithmetic.protobuf.AddressBookProtos.Person value) {  
  2292.         if (personBuilder_ == null) {  
  2293.           if (value == null) {  
  2294.             throw new NullPointerException();  
  2295.           }  
  2296.           ensurePersonIsMutable();  
  2297.           person_.set(index, value);  
  2298.           onChanged();  
  2299.         } else {  
  2300.           personBuilder_.setMessage(index, value);  
  2301.         }  
  2302.         return this;  
  2303.       }  
  2304.       /** 
  2305.        * <code>repeated .tutorial.Person person = 1;</code> 
  2306.        */  
  2307.       public Builder setPerson(  
  2308.           int index, study.java.arithmetic.protobuf.AddressBookProtos.Person.Builder builderForValue) {  
  2309.         if (personBuilder_ == null) {  
  2310.           ensurePersonIsMutable();  
  2311.           person_.set(index, builderForValue.build());  
  2312.           onChanged();  
  2313.         } else {  
  2314.           personBuilder_.setMessage(index, builderForValue.build());  
  2315.         }  
  2316.         return this;  
  2317.       }  
  2318.       /** 
  2319.        * <code>repeated .tutorial.Person person = 1;</code> 
  2320.        */  
  2321.       public Builder addPerson(study.java.arithmetic.protobuf.AddressBookProtos.Person value) {  
  2322.         if (personBuilder_ == null) {  
  2323.           if (value == null) {  
  2324.             throw new NullPointerException();  
  2325.           }  
  2326.           ensurePersonIsMutable();  
  2327.           person_.add(value);  
  2328.           onChanged();  
  2329.         } else {  
  2330.           personBuilder_.addMessage(value);  
  2331.         }  
  2332.         return this;  
  2333.       }  
  2334.       /** 
  2335.        * <code>repeated .tutorial.Person person = 1;</code> 
  2336.        */  
  2337.       public Builder addPerson(  
  2338.           int index, study.java.arithmetic.protobuf.AddressBookProtos.Person value) {  
  2339.         if (personBuilder_ == null) {  
  2340.           if (value == null) {  
  2341.             throw new NullPointerException();  
  2342.           }  
  2343.           ensurePersonIsMutable();  
  2344.           person_.add(index, value);  
  2345.           onChanged();  
  2346.         } else {  
  2347.           personBuilder_.addMessage(index, value);  
  2348.         }  
  2349.         return this;  
  2350.       }  
  2351.       /** 
  2352.        * <code>repeated .tutorial.Person person = 1;</code> 
  2353.        */  
  2354.       public Builder addPerson(  
  2355.           study.java.arithmetic.protobuf.AddressBookProtos.Person.Builder builderForValue) {  
  2356.         if (personBuilder_ == null) {  
  2357.           ensurePersonIsMutable();  
  2358.           person_.add(builderForValue.build());  
  2359.           onChanged();  
  2360.         } else {  
  2361.           personBuilder_.addMessage(builderForValue.build());  
  2362.         }  
  2363.         return this;  
  2364.       }  
  2365.       /** 
  2366.        * <code>repeated .tutorial.Person person = 1;</code> 
  2367.        */  
  2368.       public Builder addPerson(  
  2369.           int index, study.java.arithmetic.protobuf.AddressBookProtos.Person.Builder builderForValue) {  
  2370.         if (personBuilder_ == null) {  
  2371.           ensurePersonIsMutable();  
  2372.           person_.add(index, builderForValue.build());  
  2373.           onChanged();  
  2374.         } else {  
  2375.           personBuilder_.addMessage(index, builderForValue.build());  
  2376.         }  
  2377.         return this;  
  2378.       }  
  2379.       /** 
  2380.        * <code>repeated .tutorial.Person person = 1;</code> 
  2381.        */  
  2382.       public Builder addAllPerson(  
  2383.           java.lang.Iterable<? extends study.java.arithmetic.protobuf.AddressBookProtos.Person> values) {  
  2384.         if (personBuilder_ == null) {  
  2385.           ensurePersonIsMutable();  
  2386.           super.addAll(values, person_);  
  2387.           onChanged();  
  2388.         } else {  
  2389.           personBuilder_.addAllMessages(values);  
  2390.         }  
  2391.         return this;  
  2392.       }  
  2393.       /** 
  2394.        * <code>repeated .tutorial.Person person = 1;</code> 
  2395.        */  
  2396.       public Builder clearPerson() {  
  2397.         if (personBuilder_ == null) {  
  2398.           person_ = java.util.Collections.emptyList();  
  2399.           bitField0_ = (bitField0_ & ~0x00000001);  
  2400.           onChanged();  
  2401.         } else {  
  2402.           personBuilder_.clear();  
  2403.         }  
  2404.         return this;  
  2405.       }  
  2406.       /** 
  2407.        * <code>repeated .tutorial.Person person = 1;</code> 
  2408.        */  
  2409.       public Builder removePerson(int index) {  
  2410.         if (personBuilder_ == null) {  
  2411.           ensurePersonIsMutable();  
  2412.           person_.remove(index);  
  2413.           onChanged();  
  2414.         } else {  
  2415.           personBuilder_.remove(index);  
  2416.         }  
  2417.         return this;  
  2418.       }  
  2419.       /** 
  2420.        * <code>repeated .tutorial.Person person = 1;</code> 
  2421.        */  
  2422.       public study.java.arithmetic.protobuf.AddressBookProtos.Person.Builder getPersonBuilder(  
  2423.           int index) {  
  2424.         return getPersonFieldBuilder().getBuilder(index);  
  2425.       }  
  2426.       /** 
  2427.        * <code>repeated .tutorial.Person person = 1;</code> 
  2428.        */  
  2429.       public study.java.arithmetic.protobuf.AddressBookProtos.PersonOrBuilder getPersonOrBuilder(  
  2430.           int index) {  
  2431.         if (personBuilder_ == null) {  
  2432.           return person_.get(index);  } else {  
  2433.           return personBuilder_.getMessageOrBuilder(index);  
  2434.         }  
  2435.       }  
  2436.       /** 
  2437.        * <code>repeated .tutorial.Person person = 1;</code> 
  2438.        */  
  2439.       public java.util.List<? extends study.java.arithmetic.protobuf.AddressBookProtos.PersonOrBuilder>   
  2440.            getPersonOrBuilderList() {  
  2441.         if (personBuilder_ != null) {  
  2442.           return personBuilder_.getMessageOrBuilderList();  
  2443.         } else {  
  2444.           return java.util.Collections.unmodifiableList(person_);  
  2445.         }  
  2446.       }  
  2447.       /** 
  2448.        * <code>repeated .tutorial.Person person = 1;</code> 
  2449.        */  
  2450.       public study.java.arithmetic.protobuf.AddressBookProtos.Person.Builder addPersonBuilder() {  
  2451.         return getPersonFieldBuilder().addBuilder(  
  2452.             study.java.arithmetic.protobuf.AddressBookProtos.Person.getDefaultInstance());  
  2453.       }  
  2454.       /** 
  2455.        * <code>repeated .tutorial.Person person = 1;</code> 
  2456.        */  
  2457.       public study.java.arithmetic.protobuf.AddressBookProtos.Person.Builder addPersonBuilder(  
  2458.           int index) {  
  2459.         return getPersonFieldBuilder().addBuilder(  
  2460.             index, study.java.arithmetic.protobuf.AddressBookProtos.Person.getDefaultInstance());  
  2461.       }  
  2462.       /** 
  2463.        * <code>repeated .tutorial.Person person = 1;</code> 
  2464.        */  
  2465.       public java.util.List<study.java.arithmetic.protobuf.AddressBookProtos.Person.Builder>   
  2466.            getPersonBuilderList() {  
  2467.         return getPersonFieldBuilder().getBuilderList();  
  2468.       }  
  2469.       private com.google.protobuf.RepeatedFieldBuilder<  
  2470.           study.java.arithmetic.protobuf.AddressBookProtos.Person, study.java.arithmetic.protobuf.AddressBookProtos.Person.Builder, study.java.arithmetic.protobuf.AddressBookProtos.PersonOrBuilder>   
  2471.           getPersonFieldBuilder() {  
  2472.         if (personBuilder_ == null) {  
  2473.           personBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<  
  2474.               study.java.arithmetic.protobuf.AddressBookProtos.Person, study.java.arithmetic.protobuf.AddressBookProtos.Person.Builder, study.java.arithmetic.protobuf.AddressBookProtos.PersonOrBuilder>(  
  2475.                   person_,  
  2476.                   ((bitField0_ & 0x00000001) == 0x00000001),  
  2477.                   getParentForChildren(),  
  2478.                   isClean());  
  2479.           person_ = null;  
  2480.         }  
  2481.         return personBuilder_;  
  2482.       }  
  2483.   
  2484.       // @@protoc_insertion_point(builder_scope:tutorial.AddressBook)  
  2485.     }  
  2486.   
  2487.     static {  
  2488.       defaultInstance = new AddressBook(true);  
  2489.       defaultInstance.initFields();  
  2490.     }  
  2491.   
  2492.     // @@protoc_insertion_point(class_scope:tutorial.AddressBook)  
  2493.   }  
  2494.   
  2495.   private static com.google.protobuf.Descriptors.Descriptor  
  2496.     internal_static_tutorial_Person_descriptor;  
  2497.   private static  
  2498.     com.google.protobuf.GeneratedMessage.FieldAccessorTable  
  2499.       internal_static_tutorial_Person_fieldAccessorTable;  
  2500.   private static com.google.protobuf.Descriptors.Descriptor  
  2501.     internal_static_tutorial_Person_PhoneNumber_descriptor;  
  2502.   private static  
  2503.     com.google.protobuf.GeneratedMessage.FieldAccessorTable  
  2504.       internal_static_tutorial_Person_PhoneNumber_fieldAccessorTable;  
  2505.   private static com.google.protobuf.Descriptors.Descriptor  
  2506.     internal_static_tutorial_AddressBook_descriptor;  
  2507.   private static  
  2508.     com.google.protobuf.GeneratedMessage.FieldAccessorTable  
  2509.       internal_static_tutorial_AddressBook_fieldAccessorTable;  
  2510.   
  2511.   public static com.google.protobuf.Descriptors.FileDescriptor  
  2512.       getDescriptor() {  
  2513.     return descriptor;  
  2514.   }  
  2515.   private static com.google.protobuf.Descriptors.FileDescriptor  
  2516.       descriptor;  
  2517.   static {  
  2518.     java.lang.String[] descriptorData = {  
  2519.       "\n\027proto/addressbook.proto\022\010tutorial\"\332\001\n\006" +  
  2520.       "Person\022\014\n\004name\030\001 \002(\t\022\n\n\002id\030\002 \002(\005\022\r\n\005emai" +  
  2521.       "l\030\003 \001(\t\022+\n\005phone\030\004 \003(\0132\034.tutorial.Person" +  
  2522.       ".PhoneNumber\032M\n\013PhoneNumber\022\016\n\006number\030\001 " +  
  2523.       "\002(\t\022.\n\004type\030\002 \001(\0162\032.tutorial.Person.Phon" +  
  2524.       "eType:\004HOME\"+\n\tPhoneType\022\n\n\006MOBILE\020\000\022\010\n\004" +  
  2525.       "HOME\020\001\022\010\n\004WORK\020\002\"/\n\013AddressBook\022 \n\006perso" +  
  2526.       "n\030\001 \003(\0132\020.tutorial.PersonB3\n\036study.java." +  
  2527.       "arithmetic.protobufB\021AddressBookProtos"  
  2528.     };  
  2529.     com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =  
  2530.       new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {  
  2531.         public com.google.protobuf.ExtensionRegistry assignDescriptors(  
  2532.             com.google.protobuf.Descriptors.FileDescriptor root) {  
  2533.           descriptor = root;  
  2534.           internal_static_tutorial_Person_descriptor =  
  2535.             getDescriptor().getMessageTypes().get(0);  
  2536.           internal_static_tutorial_Person_fieldAccessorTable = new  
  2537.             com.google.protobuf.GeneratedMessage.FieldAccessorTable(  
  2538.               internal_static_tutorial_Person_descriptor,  
  2539.               new java.lang.String[] { "Name""Id""Email""Phone", });  
  2540.           internal_static_tutorial_Person_PhoneNumber_descriptor =  
  2541.             internal_static_tutorial_Person_descriptor.getNestedTypes().get(0);  
  2542.           internal_static_tutorial_Person_PhoneNumber_fieldAccessorTable = new  
  2543.             com.google.protobuf.GeneratedMessage.FieldAccessorTable(  
  2544.               internal_static_tutorial_Person_PhoneNumber_descriptor,  
  2545.               new java.lang.String[] { "Number""Type", });  
  2546.           internal_static_tutorial_AddressBook_descriptor =  
  2547.             getDescriptor().getMessageTypes().get(1);  
  2548.           internal_static_tutorial_AddressBook_fieldAccessorTable = new  
  2549.             com.google.protobuf.GeneratedMessage.FieldAccessorTable(  
  2550.               internal_static_tutorial_AddressBook_descriptor,  
  2551.               new java.lang.String[] { "Person", });  
  2552.           return null;  
  2553.         }  
  2554.       };  
  2555.     com.google.protobuf.Descriptors.FileDescriptor  
  2556.       .internalBuildGeneratedFileFrom(descriptorData,  
  2557.         new com.google.protobuf.Descriptors.FileDescriptor[] {  
  2558.         }, assigner);  
  2559.   }  
  2560.   
  2561.   // @@protoc_insertion_point(outer_class_scope)  
  2562. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值