protobuf: читать сообщение на C ++ из C #

Я собираюсь прочитать сообщения, которые последовательно хранятся в сокете клиента C ++ и отправляются с сервера C #.Я ожидаю, что смогу прочитать размер такого сообщения:

google::protobuf::uint32 m;
coded_input->ReadVarint32(&m);
cout << m << endl;

Затем я хочу прочитать сообщение:

Person person;
CodedInputStream::Limit limit = coded_input->PushLimit(m);
person.ParseFromCodedStream(coded_input);
coded_input->PopLimit(limit);

код C # выглядит так:

var person = new Person { Id = 123456, Name = "Fred", Address = new Address { Line1 = "Flat 1", Line2 = "The Meadows ar garą " } };
Stream str = new NetworkStream(socket);
Serializer.SerializeWithLengthPrefix(str, person, PrefixStyle.Fixed32);

Это не работает.

Я получаю C ++ error (43 является результатом cout

43

libprotobuf ERROR google / protobuf / message_lite.cc: 123] Не удается проанализировать сообщение типа "Человек" поскольку отсутствуют обязательные поля: id, name, address

Когда я не читаю вариант и не разбираю сообщение напрямую из coded_input , все в порядке (когда я меняю SerializeWithLengthPrefix на сериализацию в коде сервера) . Однако мне нужен способ различать последовательные сообщения, поэтому мне нужно знать размер сообщения, которое я собираюсь прочитать. Я просто не знаю, как отправить размер.

Я попробовал:

Stream buf = new MemoryStream();
Serializer.Serialize(buf, person);
ProtoWriter writer = new ProtoWriter(str, null);
ProtoWriter.WriteInt32((int)buf.Length, writer);

, но потом получил:

Необработанное исключение: ProtoBuf.ProtoException: недопустимый операция сериализации с проводным типом Нет в позиции 0 в ProtoBuf.ProtoWriter.WriteInt32 (Int32 значение, писатель ProtoBuf.ProtoWriter) [0x00000] в: 0
в protobuftest.MainClass.Main (System.String [] args) [0x00097] в /home/lorddidger/studia/csharp/protobuf-test/protobuf-test/Main.cs:31

Я не могу отправить int таким образом. Что не так?


Обновление: Собственно, моя цель - найти способ передать целое число (размер) с помощью protobuf. Мне нужен какой-либо пример (как C ++, так и C #), как с этим справиться, потому что я не понимаю всех деталей в protobuf.

Я заметил, что SerializeWithLengthPrefix отправляет префикс (4 uint32), который выглядит так: size 0 0 0. Размер равен количество байтов сообщения после сериализации (я думаю). Я думал, что PrefixStyle.Fixed32 говорит, что перед сообщением только один uint32, но их четыре!

Наконец, я подумал, что вам следует использовать ProtoWriter.WriteInt32 ((int) buf.Length, writer) для передачи целых чисел, потому что я последовал предложению от где-то в Интернете , который, я полагаю, является обходным путем, относящимся к C ++. Теперь я вижу, что вам не следует писать варинты - они связаны с движком, и это слишком сложно, чтобы тратить время на него.

Должен ли я отправлять сообщение с int? Как мне отличить это сообщение от следующего сообщения, размер которого хранится в первом?

Я вижу, что C # отлично справляется с префиксами, но есть ли ЛЮБОЙ СОВМЕСТИМЫЙ с C ++ и C # способ указать размер сообщения? В противном случае не существует * * способа поставить сообщения в очередь, что я считаю иррациональным.

7
задан lord.didger 3 June 2011 в 22:32
поделиться