Мне дали приложение C ++ (встроенный исполняемый файл и исходный код, который сейчас не собирается), которое использует сгенерированные прото-классы для отправки сообщений protobuf. Я взял те же файлы .proto, которые он использовал для создания своих классов, и сгенерировал связанные классы в приложении C#. Цель состоит в том, чтобы иметь возможность получать и отправлять сообщения между этими приложениями, используя protobuf- net на стороне C#. Обратите внимание, что оба используют формат proto2.
Сообщения только с членами простого типа (например, int) могут быть успешно сериализованы и десериализованы. Однако, похоже, существует проблема с десериализацией сообщений с вложенными типами сообщений в мое C# приложение, например,
message Outer {
optional Inner = 1;
}
message Inner {
optional float f = 1;
}
Полученное сообщение типа «Внешний» не сможет десериализоваться в C# через:
Serializer.Deserialize<T>(new MemoryStream(msg)); // msg is a byte[]
, что дает «Исключение недопустимого типа провода». Я перешел по ссылке здесь , но, просмотрев эти ответы, я не нашел ничего очевидного, связанного с моей ситуацией. Я на 95% уверен, что сгенерированные классы источника и назначения совпадают, данные не повреждены, и я выполняю десериализацию до правильного типа.
Могу ли я правильно десериализовать такие вложенные типы? Есть ли проблема совместимости с тем, как были созданы классы (и как они сериализованы) в приложении C ++ по сравнению с приложением C# с использованием protobuf- net?
Здесь - это пример проекта (созданный в VS 2019 для. NET Core 3.1), который воспроизводит проблему.