protobuf-net - проблема с десериализацией на стороне C ++ :( - PullRequest
2 голосов
/ 11 марта 2010

Я использую ProtoBuf-Net в своем приложении .NET для сериализации следующего: (в формате .proto)

message ProtoScreenBuffer {
optional int32 MediaId = 1;
optional bytes Data = 2;
optional bool LastBuffer = 3;
optional int64 StartTime = 4;
optional int64 StopTime = 5;
optional int32 Flags = 6;
optional int32 BufferSubType = 7;
optional int32 BufferType = 8;
optional Guid Guid = 9;
repeated int32 EncryptedDataStart = 10;
repeated int32 EncryptedDataLength = 11;
}

Моя цель состоит в том, чтобы сериализовать это и внедрить его в файл ASF, как один образец.

Я вызываю это для сериализации:

MemoryStream ms = new MemoryStream();
Serializer.Serialize<ProtoScreenBuffer>(ms, ProtoScreenBuffer.CreateProtoScreenBuffer (buffer));

затем я получаю байтовый массив из объекта ms:

ms.ToArray();

и я поместил этот байтовый массив в ASF. Большая проблема в моем приложении C ++, которое отлично читает пример ASF, я получаю нарушение доступа к памяти, когда пытаюсь десериализовать его: (

это мой код C ++:

m_screenBuffer.ParseFromArray(serBuffer, dwInputDataLen); 

(где m_screenBuffer - это ProtoScreenBuffer, serBuffer - необработанный байтовый массив, полученный мной из файла ASF, а dwInputDataLen - его длина).

Есть ли что-то, что я делаю здесь неправильно, для того, что я пытаюсь сделать (сериализовать в C # .NET и десериализовать в C ++?)

Большое спасибо.

Roey

1 Ответ

1 голос
/ 11 марта 2010

Хм ... единственное, что я мог ожидать от этого, - это Guid (я недавно понял, что моя кодировка этого кода выглядит довольно безумно-порядковой). Так что я думаю , что должно нормально работать, давать или брать какой-то грязный код для расшифровки Guid.

Чтобы исключить ошибку кодирования, я бы предложил:

  • сериализация данных через C # в файл (или просто просмотр байтов на экране в отладчике)
  • сериализация / same / data через C ++ в файл (или просто просмотр байтов на экране в отладчике)

Тогда:

  • сравнить байты
  • проверьте, что длина соответствует ожидаемой (т. Е. Число, которое вы передаете)

Это должно указывать, является ли это кодировкой, в сравнении с передачей неправильного адреса памяти или подобного.

Также - убедитесь, что вы не используете GetBuffer() (или, по крайней мере, если вы do используете GetBuffer(), убедитесь, что вы используете .Length из MemoryStream, а не из негабаритный byte[]).

...