#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 …. есть ли другие предложения!!