Я собираюсь прочитать сообщения, которые последовательно хранятся в сокете клиента 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 # способ указать размер сообщения? В противном случае не существует * * способа поставить сообщения в очередь, что я считаю иррациональным.