2016-12-13 8 views
1

Мое перечисление в java выглядит так (см. Ниже). Что это было бы в .proto? Не удалось выяснить, как позаботиться о конструкторах и методах Getter для переменных (тип и код).Буферы протокола: как сделать файл .proto для перечисления?

public enum PaxType { 
    ADULT("ADT", 'A'), 
    CHILD("CNN", 'C'), 
    INFANT("IFT", 'I'); 

    private String type; 
    private char code; 

    PaxType(String type, char code) { 
     this.type = type; 
     this.code = code; 
    } 

    public String getType() { 
     return type; 
    } 

    public char getCode() { 
     return code; 
    } 
} 
+1

Возможный дубликат [Как Share значения перечислений между моей Java кода и .proto файл] (http://stackoverflow.com/вопросы/19130965/как-делать-я-шер-перечислений-значения-между-мой-Java-кода, а-прото-файл) – greybeard

ответ

2

Основываясь на принятом ответе и некотором дополнительном исследовании здесь полный рабочий пример.

предположим следующие файлы в текущем каталоге

PaxTypeEnum.proto 
TestProtobufEnum.java 
// https://github.com/google/protobuf/releases 
protoc-3.1.0-linux-x86_64.zip 
// https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java 
protobuf-java-3.1.0.jar 

PaxTypeEnum.proto

syntax = "proto2"; 

import "google/protobuf/descriptor.proto"; 

message EnumProto { 
    extend google.protobuf.EnumValueOptions { 
    optional string name = 50000; 
    optional string singleCharCode = 50001; 
    } 

    enum PaxType { 
    ADULT = 0 [(name) = "ADT", (singleCharCode) = 'A']; 
    CHILD = 1 [(name) = "CNN", (singleCharCode) = 'C']; 
    INFANT = 2 [(name) = "IFT", (singleCharCode) = 'I']; 
    } 
} 

TestProtobufEnum.java

import com.google.protobuf.DescriptorProtos; 
import com.google.protobuf.Descriptors; 
import java.util.Map; 
import java.util.Set; 

class TestProtobufEnum { 
    public static void main(String[] args) { 
     PaxTypeEnum.EnumProto.PaxType CHILD =. 
      PaxTypeEnum.EnumProto.PaxType.CHILD; 

     System.out.println("get fields dynamically for PaxType.CHILD"); 
     Set<Map.Entry<Descriptors.FieldDescriptor, Object>> allFields =. 
      CHILD.getValueDescriptor().getOptions().getAllFields().entrySet(); 
     for (Map.Entry<Descriptors.FieldDescriptor, Object> entry : allFields){ 
      System.out.printf("field: descriptor: %-14s value: %s%n", 
        entry.getKey().getName(), 
        entry.getValue() 
      ); 
     } 

     System.out.println("get fields statically"); 
     PaxTypeEnum.EnumProto.PaxType[] paxTypes =. 
       PaxTypeEnum.EnumProto.PaxType.values(); 
     for (PaxTypeEnum.EnumProto.PaxType value : paxTypes) { 
      DescriptorProtos.EnumValueOptions options =. 
        value.getValueDescriptor().getOptions(); 
      System.out.printf("PaxType: %-6s name: %s singleCharCode: %s%n", 
        value.toString(), 
        options.getExtension(PaxTypeEnum.EnumProto.name), 
        options.getExtension(PaxTypeEnum.EnumProto.singleCharCode) 
      ); 
     } 

    } 
} 
  1. разархивируйте protoc-3.1.0-linux-x86_64.zip в текущем каталоге
  2. переменные среды набор

    PROTO_HOME=$(pwd) 
    PATH=${PROTO_HOME}/bin:${PATH} 
    
  3. генерировать источник Java из файла *.proto

    protoc PaxTypeEnum.proto --java_out=. --proto_path=${PROTO_HOME}/include:. 
    
  4. компилировать демо Java

    javac -cp .:protobuf-java-3.1.0.jar TestProtobufEnum.java 
    
  5. запустить Java-Demo

    java -cp .:protobuf-java-3.1.0.jar TestProtobufEnum 
    

выход

get fields dynamically for PaxType.CHILD 
field: descriptor: name   value: CNN 
field: descriptor: singleCharCode value: C 

get fields statically 
PaxType: ADULT name: ADT singleCharCode: A 
PaxType: CHILD name: CNN singleCharCode: C 
PaxType: INFANT name: IFT singleCharCode: I 
3

Нет рекомендуемого способа представления классов enum java. Но вы можете следовать примеру.

import "google/protobuf/descriptor.proto"; 

extend google.protobuf.EnumValueOptions { 
    optional string type= 51234; 
    optional string code= 51235; 
} 

enum PaxType { 
    ADULT = 0 [(type) = "ADT", (code) = 'A']; 
    CHILD = 1 [(type) = "CNN", (code) = 'C']; 
    INFANT = 2 [(type) = "IFT", (code) = 'I'] 
} 

В аннотации осуществляется доступ через интерфейс EnumValueDescriptor.