2015-03-16 2 views
2

У меня есть три приложения, которые осуществляют связь через ZeroMQ, выполняя различные операции. Различные приложения следующим образом:Межплатформенное прообразование по протоколу

  1. Первое приложение C++, который является двигателем для «тяжелой работы», это занимает сообщение Protobuf как запрос от клиента, делает какую-то работу, и возвращает Protobuf сообщение обратно этому клиенту (или тому, кто подключен, шаблон запроса/ответа). Это использует 0MQ версии 4.0.4 и использует protobuf-2.6.0, где мы сами создали необходимые файлы заголовков, классы Protobuf были созданы протоком.

  2. Во-вторых у меня есть код Java и является поставщиком данных, это использует jeromq-0.3.4.jar для обмена сообщениями ZeroMQ и Protobuf-Java-2.6.1.jar для Protobuf сериализации и т.д.

  3. Третий У меня есть код 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#, опять же это не помогает, сообщение принимается с использованием любой комбинации выше, но полученный кажется некорректным.

Что здесь может быть неправильным и есть ли что-нибудь, что я должен делать, о котором я не упоминал?

ответ

1

Моя догадка заключается в том, что type обрабатывается как optional, где, как и в C++, обозначен как required. Я не могу видеть, как ваша модель определена в C#, но если вы используете атрибуты Protobuf-Net, вы можете заставить его сериализации с помощью элемента в IsRequired атрибута:

[ProtoMember(42, IsRequired = true)] // change the number! 
public Taurus.FeedMux.Type type {get;set;} 
+0

Большое спасибо за ваше время Марк , Любые проспекты оцениваются, поскольку я потратил годы, пытаясь разобраться в этом. Я дам вам знать, как я иду ... Еще раз спасибо. – MoonKnight

+0

Привет, Марк, большое спасибо за ваше время здесь.Я отредактировал вопрос, чтобы показать скрипты, которые генерируют классы, на которых вы были в значительной степени замечены, были несоответствующие классы. Я просто задавался вопросом, знаете ли вы, как я могу сделать эквивалент -p: detectMissing с использованием protoc, я не могу найти соответствующий параметр в документации. – MoonKnight

+0

Я задал еще один вопрос здесь ... http://stackoverflow.com/questions/29081021/protogen-vs-protoc-compiler-options – MoonKnight

Смежные вопросы