c # — protobuf-net в .proto генерирует конфликты перечислений?

В C # у нас есть пространства имен в .proto, которые мы получаем из protobuf-net, мы не получаем никаких пространств имен. Таким образом, вопрос в том, как заставить protobuf-net генерировать (и использовать внутри) файлы .proto с именами-пакетами / пакетами.

Пример, когда мы проанализировали весь наш проект для создания файлов .proto для подключения приложения C ++ к нашему приложению C #, мы получили тонны

enum AnimationCode {
None = 0;
Idle = 1;
//...
}

а также

enum SessionCode {
None = 0;
//...
}

И поэтому, когда мы передали этот унифицированный файл проекта .proto компилятору protogen, мы получили тонны

Тип перечисления «SessionStateCode» не имеет значения с именем «Нет».

а также

Обратите внимание, что значения перечисления используют правила области видимости C ++, то есть значения перечисления
братья и сестры своего типа, а не дети этого.

и нет кода C ++.

Цель состояла в том, чтобы сделать так, чтобы закодированное сообщение C # было бы по крайней мере читабельным из C ++

5

Решение

В настоящее время в protobuf-net нет кода для выполнения автоматических исправлений коллизий имен, хотя мне было бы интересно узнать, есть ли у вас какие-либо предложения. Другой вариант будет:

    enum AnimationCode {
[ProtoEnum(Name="AnimationCode_None")]
None = 0,
Idle = 1
}

Здесь .proto будет использовать AnimationCode_None когда генерируется сценарий; на самом деле это будет:

enum AnimationCode {
AnimationCode_None = 0;
Idle = 1;
}

Я проверил MetaType/ValueMember API, и похоже, что в настоящее время было бы трудно установить .Name во время выполнения, но это может быть исправлено в новом выпуске достаточно легко (как с это подобное перечисление /MetaType фиксировать), если вы предпочитаете устанавливать их во время выполнения, а не украшать атрибутами.

2

Другие решения

Вы пробовали это?

package MyNamespace{
enum AnimationCode {
None = 0;
Idle = 1;
//...
}
}
0

По вопросам рекламы [email protected]