J'écris un sérialiseur/désérialiseur binaire pour convertir un certain nombre de types d'objets vers/depuis un flux d'octets. Les objets représentent des commandes API et leurs réponses associées pour un dispositif connecté par Bluetooth ou USB. J'utilise l'interface BinaryWriter
& BinaryReader
pour écrire/lire dans/depuis le flux.
Le sérialiseur est facile. Les propriétés à sérialiser sont marquées avec un attribut qui spécifie l'ordre dans lequel elles doivent être écrites dans le flux d'octets. J'itère à travers les propriétés en utilisant la réflexion et les poignées de résolution de surcharge, en choisissant les propriétés correctes. Write(...)
de la méthode BinaryWriter
.
Le désérialiseur n'est pas aussi simple. Encore une fois, je peux itérer à travers les propriétés de la classe de réponse particulière que j'attends pour déterminer les types qui doivent être lus à partir du flux. La partie la plus délicate est de choisir la bonne méthode à appeler sur le fichier BinaryReader
pour lire la valeur dont j'ai besoin. J'ai pensé à deux approches.
- Une grosse instruction de commutation qui appelle le bon
ReadXXXX()
en fonction du type à lire. - Utilisez le nom du type dont j'ai besoin pour construire le nom de la méthode dont j'ai besoin dans une chaîne de caractères, puis invoquez la méthode en utilisant la réflexion.
Y a-t-il un moyen plus simple auquel je ne pense pas ? C'est juste dommage que vous ne puissiez pas faire une résolution de surcharge basée sur le type de retour que vous voulez.