Буфер протокола: проблема с перечислением

#java #protocol-buffers

#java #буферы протокола

Вопрос:

У меня есть следующий файл .proto :

 enum Enum1{
    X=0;
    Y=1;    
}
message SomeClass{
    required  Enum1 enum1=1;
    required Enum2 enum2=2;
}
enum Enum2{
    X=0;
    Z=1;    
}
 

Когда я пытаюсь скомпилировать его с помощью протокола, я получаю следующую ошибку :

proto.proto:19:5: «X» уже определено proto.proto:19:5: Обратите внимание, что значения enum используют правила определения области видимости C , что означает, что значения enum являются братьями и сестрами своего типа, а не его дочерними элементами. Следовательно, «X» должен быть уникальным, а не только внутри «Enum2».

Я могу каким-либо образом решить эту проблему!

Комментарии:

1. Вы имеете в виду переименовать X @ Enum2!! если да, я не могу прямо сейчас, так как есть зависимость от приложения,

2. У вас есть два одинаковых экземпляра enum, X.

Ответ №1:

Вы можете включить свое перечисление в другое сообщение, чтобы видимость не конфликтовала.

Exemple :

 message Enum1{
 enum Enum{
     X=0;
     Y=1;    
 }
}

message Enum2{
 enum Enum{
     X=0;
     Y=1;    
 }
}

message SomeClass{
    required  Enum1.Enum enum1=1;
    required Enum2.Enum enum2=0;
}
 

Вы также можете добавить к своему значению enum что-нибудь. Если вы не измените число после имени вашего значения, оно должно оставаться совместимым с вашей старой версией:
ex:

 enum Enum1{
    E1_X=0;
    E1_Y=1;    
}
enum Enum2{
    E2_X=0;
    E2_Z=1;    
}
message SomeClass{
    required  Enum1 enum1=1;
    required Enum2 enum2=2;
}
 

Комментарии:

1. required удаляется из proto3

2. Этому вопросу 8 лет. Он будет работать с proto3, если используется без необходимости.

Ответ №2:

Тогда вы можете использовать префикс в перечислении

 enum Enum1{
    E1_X=0;
    E1_Y=1;    
}
message SomeClass{
    required Enum1 enum1=1;
    required Enum2 enum2=2;
}
enum Enum2{
    E2_X=0;
    E2_Z=1;    
}
 

Ответ №3:

вместо

 message SomeClass{
required  Enum1 enum1=1;
required Enum2 enum2=2; }
 

я думаю, у вас должно быть что-то вроде

 message SomeClass{
    required  Enum1 enum1.Y;
    required Enum2 enum2.Z;
}
 

редактировать: вы пометили это как Java, но в вопросе, который вы ссылаетесь на c , это ведьма?

edit2: после небольшого поиска в Google я нашел это http://www.mail-archive.com/protobuf@googlegroups.com/msg04986.html

вам нужно переименовать enum1.X или enum2.x в какое-либо другое имя, чтобы они не конфликтовали.

 enum Enum1{
    W=0;
    Y=1;    
}
message SomeClass{
    required  Enum1 enum1=1;
    required Enum2 enum2=0;
}
enum Enum2{
    X=0;
    Z=1;    
}
 

если вы действительно не можете из-за зависимостей приложений, я думаю, вам нужно как-то перепроектировать свою программу..

Комментарии:

1. Я использую Java, но когда я компилирую свой файл .proto с помощью компилятора протокола, я получаю ошибку, о которой я упоминал.

2. Но, как вы упомянули, Enum1 всегда будет иметь значение enum1.Y …. есть ли другие предложения!!