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

Était-ce utile?

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é)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top