protobuf-net - problema con la deserializzazione sul lato C ++ :(
-
19-09-2019 - |
Domanda
Sto usando protobuf-Net nella mia applicazione .NET per serializzare il seguente: (in formato 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;
}
Il mio obiettivo è quello di serializzare questo e iniettare in un file ASF, come un singolo campione.
Io chiamo questo serializzare:
MemoryStream ms = new MemoryStream();
Serializer.Serialize<ProtoScreenBuffer>(ms, ProtoScreenBuffer.CreateProtoScreenBuffer (buffer));
allora ottengo un array di byte dall'oggetto ms:
ms.ToArray();
e ho messo questo array di byte in ASF. Il grosso problema è sul mio ++ app C che legge il campione ASF bene, ho una violazione di accesso di memoria quando si tenta di deserializzare esso: (
Questo è il mio codice C ++:
m_screenBuffer.ParseFromArray(serBuffer, dwInputDataLen);
(dove è m_screenBuffer ProtoScreenBuffer, serBuffer è l'array di byte grezzo ho ottenuto dal file ASF e dwInputDataLen è la lunghezza di esso.)
sono una delle cose che sto facendo qui sbagliato, per quello che sto cercando di fare (serializzare in C # .NET e deserializzare in C ++?)
Grazie mille.
Roey
Soluzione
Hmm ... l'unica cosa in là che potrei aspetto di essere disordinato è il Guid
(di recente ho capito che la mia codifica di questo sembra essere abbastanza pazzo-endian). Così I pensare che dovrebbe funzionare bene, più o meno un certo codice disordinato di decifrare il Guid
.
Per escludere un errore di codifica, quello che vorrei suggerire è:
- serializzare i dati tramite C #, in un file (o semplicemente guardare i byte sullo schermo nel debugger)
- serializzare gli stessi / dati / via C ++, in un file (o semplicemente guardare il byte sullo schermo nel debugger)
Quindi:
- confrontare i byte
- controllare la lunghezza è ciò che ci si aspetta (vale a dire il numero che si sta passando sopra)
Questo dovrebbe far sapere se è la codifica, vs qualcosa a che fare con il passare l'indirizzo di memoria sbagliato o simile.
Inoltre - controllare non si utilizza GetBuffer()
(o almeno, se si non uso GetBuffer()
, assicurarsi di utilizzare il .Length
dal MemoryStream
, e non dal byte[]
sovradimensionato)