У меня есть три приложения, которые осуществляют связь через ZeroMQ, выполняя различные операции. Различные приложения следующим образом:Межплатформенное прообразование по протоколу
Первое приложение C++, который является двигателем для «тяжелой работы», это занимает сообщение Protobuf как запрос от клиента, делает какую-то работу, и возвращает Protobuf сообщение обратно этому клиенту (или тому, кто подключен, шаблон запроса/ответа). Это использует 0MQ версии 4.0.4 и использует protobuf-2.6.0, где мы сами создали необходимые файлы заголовков, классы Protobuf были созданы протоком.
Во-вторых у меня есть код Java и является поставщиком данных, это использует jeromq-0.3.4.jar для обмена сообщениями ZeroMQ и Protobuf-Java-2.6.1.jar для Protobuf сериализации и т.д.
Третий У меня есть код C#, который выполняет некоторый анализ и имеет хороший интерфейс и т. Д. Это использует protobuf-net Марка Гравелла (https://www.nuget.org/packages/protobuf-net/) как пакет NuGet и NetMQ (собственный C# порт ZeroMQ) для обмена сообщениями.
Теперь, C++ < -> Java прекрасно работает и с вне проблем, однако, C++ < -> C# не работает правильно. Когда я посылаю основной запрос от C# на C++ "сервер" с помощью
using (NetMQContext context = NetMQContext.Create())
using (var requestSocket = context.CreateRequestSocket())
{
requestSocket.Connect(_requestAddress); // "tcp://127.0.0.1:6500"
requestSocket.Send(mux.ToByteArray<Taurus.FeedMux>());
}
с
public static byte[] ToByteArray<T>(this T o)
where T : ProtoBuf.IExtensible
{
if (o == null)
return null;
using (MemoryStream ms = new MemoryStream())
{
ProtoBuf.Serializer.Serialize(ms, o);
return ms.ToArray();
}
}
код C++ получает сообщение, но, несмотря на установление обязательного
Taurus.FeedMux mux = new Taurus.FeedMux();
mux.type = Taurus.FeedMux.Type.OXX;
mux.oxx = Oxx.GetOxx();
я получаю ошибка в приложении C++
[l ibprotobuff ERROR .. \\ message_lite.cc:123] Невозможно разобрать сообщение типа «Taurus.FeedMux», потому что отсутствуют необходимые поля: тип
Но я четко устанавливая type
и в коде C++, тип, кажется, установлен (используя отладчик для проверки десериализованного объекта). Я пробовал две разные библиотеки Protobuf (один я построил и библиотеку Марка Гравелла через NuGet), поскольку я думал, что это проблема сериализации, но это не устраняет эту проблему.
Я также попробовал библиотеку обертки clrZMQ, а также собственную библиотеку NetMQ на C#, опять же это не помогает, сообщение принимается с использованием любой комбинации выше, но полученный кажется некорректным.
Что здесь может быть неправильным и есть ли что-нибудь, что я должен делать, о котором я не упоминал?
Большое спасибо за ваше время Марк , Любые проспекты оцениваются, поскольку я потратил годы, пытаясь разобраться в этом. Я дам вам знать, как я иду ... Еще раз спасибо. – MoonKnight
Привет, Марк, большое спасибо за ваше время здесь.Я отредактировал вопрос, чтобы показать скрипты, которые генерируют классы, на которых вы были в значительной степени замечены, были несоответствующие классы. Я просто задавался вопросом, знаете ли вы, как я могу сделать эквивалент -p: detectMissing с использованием protoc, я не могу найти соответствующий параметр в документации. – MoonKnight
Я задал еще один вопрос здесь ... http://stackoverflow.com/questions/29081021/protogen-vs-protoc-compiler-options – MoonKnight