[C#] Marshalling, et structures

Dans ma super application réseau, je transmets des paquets UDP. Tous mes paquets on une entête, qui à la structure suivante:

struct Packet { PacketType Type; Int16 PacketIdentifier; PacketPriority Priority; }

J’ai d’autres paquets, comme le paquet ACK:

struct PacketAcknowledge { Int16 AcknowledgeIdentifier; }

Le truc c’est que j’aimerais que PacketAcknowledge dérive de Packet, parce que tous les paquets ont l’entête. Seulement il me semble que ce n’est pas possible?

Ou alors est ce que je dois inclure dans chaque paquet la structure entete? Ca semble possible, mais pas logique. Mes paquets sont une spécialisation d’un paquet de base… pas le contraire… (et ca me fait chier de faire Ack.Header.Priority, au lieu de faire directement Ack.Priority).

De plus j’ai entendu parler de marshalling qui permet de convertir des structures en byte[] pour l’envoyer sur le réseau. J’ai pas tout saisi comment cela fonctionne. J’ai bien lu la doc msdn mais ca m’a l’air un peu flou.

[edit]
Je viens de trouver ca:
http://groups.google.com/group/microsoft.p…ca6bf0fbe973b67

Idéalement ca ferait ce que je souhaite, seulement il reste un petit problème: vu que j’ai des paquets différents (ACK, UPDATE, etc…) comment je fais pour savoir dans quelle structure stocker le paquet vu que le type est transmis dans le buffer?

En gros pour refaire la structure, j’ai besoin de son type, qui est contenu dans le buffer, donc pour le savoir j’ai besoin de décompacter. Et pour décompacter, j’ai besoin du type.

Un petit peu de bidouillage, genre le rajout d’un premier byte servant à connaitre le type du paquet qui suit ?

Donc utiliser un fieldoffsetattribute pour mettre le packetType en premier, faire un switch et ensuite démarshalliser. J’aime bien :P.

Et pour mon problème de structure dans la structure? Ca passe le marshalling?

Au fait autre question: est il possible de marshaliser des hashtables?

[quote name=’[PERE]Cil’ date=’ 20 Sep 2005, 16:54’]Donc utiliser un fieldoffsetattribute pour mettre le packetType en premier, faire un switch et ensuite démarshalliser. J’aime bien :P.

Et pour mon problème de structure dans la structure? Ca passe le marshalling?

Au fait autre question: est il possible de marshaliser des hashtables?
[right][post=“399498”]<{POST_SNAPBACK}>[/post][/right][/quote]

Les structures dans les structures, ca passe, je l’ai fait (voir SharpSmart, sur mon site). Par contre, la ou tu commence a avoir des soucis, c’est quand t’as des tableaux de structures dans les structures…

wOot j’ai vu ta doc SharpSmart… elle est faite avec quoi?

[quote name=’[PERE’]Cil, 21 Sep 2005, 09:51]wOot j’ai vu ta doc SharpSmart… elle est faite avec quoi?
[right][post=“399695”]<{POST_SNAPBACK}>[/post][/right][/quote]
http://ndoc.sourceforge.net/

[quote name=‹ Tzim › date=’ 20 Sep 2005, 23:29’]Les structures dans les structures, ca passe, je l’ai fait (voir SharpSmart, sur mon site). Par contre, la ou tu commence a avoir des soucis, c’est quand t’as des tableaux de structures dans les structures…
[right][post=« 399687 »]<{POST_SNAPBACK}>[/post][/right][/quote]
Tout le monde comprend pourquoi j’espere :stuck_out_tongue: Les structs sont allouees sur la stack elle meme, au contraire des classe qui sont sur la heap. La struct est rangee « a plat » sur la stack et donc les trucs de taille variable ca va pas du tout, il faut toujours que sizeof(la struct) soit definit au moment de l’allocation, c’est a dire a la declaration… Les structs sont des « value type » (comme un int ou autre), pas des references et se comportent donc comme telles.

Ouais donc, tant pis pour moi, pas de Hashtable dans ma structure. Donc pas de marshalling. Donc en fait j’ai tout bien fait comme il fallait:

  • classe Message avec toutes les autres classes dérivées
  • et une jolie fonction GetBytes() qui me retourne un beau tableau de byte à envoyer
  • et une jolie fonction statique SetBytes() qui crée la classe correspondante.