Проблема с переносом двойного свойства из C ++ в C # с помощью Google Protocol Buffer и Protobuf-C #

Я пытаюсь отправить объект в виде сериализованной строки из 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.

Это происходит, только если я присваиваю значение двойному типу, такому как цена.

1

Решение

Несмотря на название, я не верю, что SerializeAsString действительно преобразует его в текст — так что вы не должны рассматривать его как текст на стороне C #. Я сильно подозреваю, что это неверная интерпретация двоичных данных как текста в кодировке UTF-8.

Я ничего не знаю о QPID, но при условии, что вы можете передать произвольный двоичный сообщения таким образом, это то, что вы должны сделать. если ты не может Передача произвольных двоичных сообщений через QPID, тогда буфер протокола может оказаться для вас неподходящим решением — они действительно разработаны как эффективное двоичное представление. Конечно, вы можете кодировать данные с помощью base64, но вы можете найти более подходящие подходы.

1

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

Как сказал Джон Скит, я думаю, что 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 #, поэтому не могу посоветовать по коду использовать

0

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