protobuf-net - problème avec désérialisation du côté C :(
-
19-09-2019 - |
Question
J'utilise Protobuf-Net dans mon application .NET pour sérialiser les éléments suivants: (en .proto le format)
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;
}
Mon but est de sérialiser et l'injecter dans un fichier ASF, comme un seul échantillon.
Je l'appelle à la sérialisation:
MemoryStream ms = new MemoryStream();
Serializer.Serialize<ProtoScreenBuffer>(ms, ProtoScreenBuffer.CreateProtoScreenBuffer (buffer));
je reçois un tableau d'octets de l'objet ms:
ms.ToArray();
et je mets ce tableau d'octets dans la FAA. Le gros problème est sur mon application C ++ qui lit l'échantillon ASF très bien, je reçois une violation d'accès mémoire lorsque je tente de désérialiser: (
est mon code C ++:
m_screenBuffer.ParseFromArray(serBuffer, dwInputDataLen);
(où m_screenBuffer est ProtoScreenBuffer, serBuffer est le tableau d'octets brut je suis arrivé à partir du fichier ASF et dwInputDataLen est la longueur de celui-ci.)
Est-ce que des choses que je fais ici mal, pour (? Sérialisation dans .NET C # et désérialiser en C ++) ce que je suis en train de faire
Merci beaucoup.
Roey
La solution
Hmm ... la seule chose là-dedans que je pourrais attendre d'être en désordre est le Guid
(j'ai récemment réalisé que mon codage de ce qui semble être assez fou-endian). Donc, je pense qui devrait fonctionner correctement, donner ou prendre un peu de code malpropre pour déchiffrer le Guid
.
Pour exclure une erreur de codage, ce que je suggère est:
- sérialiser les données via C #, dans un fichier (ou tout simplement regarder les octets à l'écran dans le débogueur)
- sérialiser les mêmes / / données via C ++, un fichier (ou juste regarder les octets à l'écran dans le débogueur)
Alors:
- comparer les octets
- vérifier la longueur est ce que vous attendez (à savoir le numéro que vous allez passer)
Cela devrait indiquer si elle est l'encodage, contre quelque chose à voir avec passage de l'adresse erronée ou similaire.
En outre - vérifiez que vous n'utilisez pas GetBuffer()
(ou du moins, si vous ne utiliser GetBuffer()
, assurez-vous d'utiliser le .Length
du MemoryStream
, et non de la byte[]
surdimensionné)