Я пытаюсь отправить объект в виде сериализованной строки из C ++ в C # через QPID, который является системой обмена сообщениями. В настоящее время у меня есть файл прото Google как таковой:
package Serializable;
message Order_ser
{
optional int32 openord = 1 [default = 0];
optional int32 oldord = 2 [default = 0];
optional double price = 3 [default = 0];
}
Я получаю ошибку в конце C # при передаче объекта через C ++
Protocol message tag had invalid wire type.
Это происходит, только если я присваиваю значение двойному типу, такому как цена.
Несмотря на название, я не верю, что SerializeAsString
действительно преобразует его в текст — так что вы не должны рассматривать его как текст на стороне C #. Я сильно подозреваю, что это неверная интерпретация двоичных данных как текста в кодировке UTF-8.
Я ничего не знаю о QPID, но при условии, что вы можете передать произвольный двоичный сообщения таким образом, это то, что вы должны сделать. если ты не может Передача произвольных двоичных сообщений через QPID, тогда буфер протокола может оказаться для вас неподходящим решением — они действительно разработаны как эффективное двоичное представление. Конечно, вы можете кодировать данные с помощью base64, но вы можете найти более подходящие подходы.
Как сказал Джон Скит, я думаю, что SerializeAsString вернет буфер протокола в его текстовом представлении (см. https://developers.google.com/protocol-buffers/docs/overviewто есть
# Textual representation of a protocol buffer.
# This is *not* the binary format used on the wire.
person {
name: "John Doe"email: "[email protected]"}
Простая запись строки определит, правильно ли это. Этот формат не имеет отношения к двоичному формату, поэтому не могу быть десериализованным вы пытаетесь сделать.
Варианты (от лучшего к худшему)
* Сериализация байтового массива и отправка / получение в виде байтов
* Сериализация байтового массива и кодирование / декодирование байтового массива как Base64
* Кодируйте как String, как вы делаете, и используйте String-Deserialise.
Я не использую C или C #, поэтому не могу посоветовать по коду использовать