Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Serialisation binaire dans un flux mémoire [ Système / Fichier & Disque ] (renyone)

vendredi 4 juillet 2008 à 11:45:19 | Serialisation binaire dans un flux mémoire

renyone

Salut, j'ai l'impression que quelquechose m'échappe et je sollicite donc votre aide.

J'ai une méthode de sérialisation binaire dans un flux mémoire de la forme:

public

unsafestaticstring FormatTypes<T>(T myObject)

{

BinaryFormatter bf = newBinaryFormatter();

MemoryStream ms = newMemoryStream();

bf.Serialize(ms, myObject);

ms.Close();

byte[] buffer = ms.ToArray();

...

}


Quand j'essaye tout bêtement de sérialiser un sbyte, la tailler de buffer est de 51 alors que je m'attendais à avoir plutot 1 vu que les sbytes sont stockés sur 1 octet.

Quelqu'un aurait-il une idée la dessus?

Merci d'avance.

vendredi 4 juillet 2008 à 12:30:30 | Re : Serialisation binaire dans un flux mémoire

SharpMao

Membre Club
Hello,

C'est parce que la sérialisation binaire garde certaines informations en plus, comme le type de l'objet sérialisé.

Si tu enregistre le contenu de ton buffer dans un fichier et que tu l'ouvres avec un notepad, tu verras, en plus de certains caractères de contrôles : "System.SByte" et "m_value" écris en toutes lettres.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)

vendredi 4 juillet 2008 à 12:31:12 | Re : Serialisation binaire dans un flux mémoire

niky

Membre Club
Salut,

C'est parfaitement normal.
La sérialisation ne consiste pas seulement à stocker les types simples (int, string, byte, bool, etc).
Si tu sérialises des classes, le framework doit stocker le nom de la classe. Si plus est les classes que tu sérialises ont des liens entre elles, ces références doivent être enregistrés aussi.



vendredi 4 juillet 2008 à 13:07:22 | Re : Serialisation binaire dans un flux mémoire

renyone

Merci de vos réponses.

Mais dans ce cas, comment recupérer (désérialiser) les données "essentielles" comme la valeur du sbyte placé en paramètre? Parce que je dois récupérer ce tableau de bytes (buffer dans le code ci-dessus) et l'utiliser dans une fonction C++ qui aura pour but de le décoder.

Pour résumer:

fonction c# qui sérialise mes données dans un flux mémoire ==> tableau de bytes [] ==> fonction c++ qui décode (désérialise) le tableau de sbyte (char*).

Merci !

A+

vendredi 4 juillet 2008 à 14:54:12 | Re : Serialisation binaire dans un flux mémoire

niky

Membre Club

Typiquement, la sérialisation bnaire est spécifique à chaque environnement : Java sérialise d'une certaine manière, .Net de sa manière, etc.
La bibliothèque standard de C++ ne possède pas de moteur de sérialisation.

Pour échanger un tableau de entre .Net et C++ (je ne parle pas de C++ .Net), tu as la possibilité
- de passer un pointeur sur ton tableau (c'est ce qui est fait quand on appel une API Windows en .Net)
- d'écrire dans un fichier (assez moyen comme technique)
- de passer par un méthode standardisé d'échange de données (c'est typiquement le cas de SOAP/CORBA, RPC)

vendredi 4 juillet 2008 à 15:00:25 | Re : Serialisation binaire dans un flux mémoire

renyone

Merci Nicky.

Je pensais effectivement passer un pointeur sur le tableau. La méthode c# doit obligatoirement renvoyer un tableau de bytes (ce n'est pas moi qui décide...) que je dois passer sous forme de pointeurs de caractères (char*) à ma méthode c++.

A ce niveau j'ai un problème: comment convertir ce bytes[] en char* ?


vendredi 4 juillet 2008 à 19:29:58 | Re : Serialisation binaire dans un flux mémoire

niky

Membre Club
Réponse acceptée !
Un byte[] .Net est l'équivalent de char* en C. Tout comme char[] et Int16[] sont l'équivalent de short* (car les char .Net sont stocké sur 2 octets).

Je présume que tu dois posséder une DLL et que tu souhaites appeler une fonction de cette DLL.
Par exemple, pour appeler une fonction C qui a le prototype suivant et qui est exposé dans la DLL nommée "mylib.dll" :
int myfunction(char *input)

C'est une fois en C# où tu peux commencer à faire un peu n'importe quoi. En fait, pour représenter un pointeur, tu peux avoir plusieurs notations qui sont équivalentes
[DllImport("mylib.dll")]
static extern int myfunction(byte[] input);

ou
[DllImport("mylib.dll")]
static extern int myfunction(ref byte input);

ou
[DllImport("mylib.dll")]
static extern int myfunction(IntPtr input);

et même, car un pointeur n'est rien d'auteur qu'un entier :
[DllImport("mylib.dll")]
static extern int myfunction(int input);


Après, le compilateur .Net ne te permettra pas d'appeler ces 3 écritures avec un byte[] en premier argument (seule la première sera acceptée par le compilo). Toutefois, toutes ces écritures reviennent à passer un char*.
Tu trouveras de la litterature là dessous en recherchant autour des termes Interop et Marshal.

jeudi 10 juillet 2008 à 17:08:35 | Re : Serialisation binaire dans un flux mémoire

renyone

Effectivement, tout ceci peut se trouver dans la litterature, en tappant interoperabilité c# c++ par exemple. Il est res facile d'utiliser la classe Marshall ensuite.
Merci bien!



Cette discussion est classé dans : ms, binaire, flux, mémoire, serialisation


Répondre à ce message

Sujets en rapport avec ce message

Récupérer un flux audio [ par 24buzz ] Salut, Je voudrais récupérer un flux audio d'un SecondaryBuffer. Je m'explique, je voudrais récupérer les bits d'un fichier audio en cours de lecture Serialisation avec binaryFormatter [ par ducker88 ] Bonjour à tous.Je suis en train d'essayer de serialiser un string en binaire par l'intermediaire d'un memorystream. Et ensuite de le recuperer.Voici m Image, flux binaire , redimensionnement [ par Diamondduff ] Je suis un peu perplexe, comment cela fonctionne t-il? quel type de composant il faut pour faire ca?L'image est affichée apparemment par flux, la tail Serialisation [ par RM50Man ] Quand doit on utiliser la serialisation?RM50man Flux des fichiers images [ par billou_13 ] Alors, voila mon titre est pas trop explicite mais par ce message, je vais essayer de l'être. J'ai un code qui réceptionne une image par une connexio MySQL : C# express ajouter une connection [ par smis ] Bonjour,je viens à peine d'installer le C# express pour une longue utilisation. je posséde une base de donnée MySQL que j'ai intégré dans les sources Process avec output dans une textbox [ par sosekeyser ] Bonjour,Je bosse sur une application windows form en C#2.0.Je souhaite lancer une application externe au projet, qui s'execute dans une fenêtre MS-DOS Operation binaire [ par drcmomo ] Bonjour tout le monde J'ai un tableau qui contient les donnees suivantes <font size fonction binaire [ par machigan ] Bonjour,Je souhaiterais tracer une série de 1 et 0 que je possède dans un tableau avec zedgraph et je ne sais pas comment procéder. Merci d'avance. flux http et xml [ par lenoil55 ] bonjour à tous,j'ai le code suivant dans une page aspx en csharp. Ce code execute une requete http (variable sReq = <font col


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,359 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.