Threading and Synchronization

Advertisements

SerializationBinder Class

Je viens, par hazard, de découvrir une nouvelle classe du framework .Net: SerializationBinder. Elle permet customiser  les Types utilisés lors de la désérialisation.

Pour chaque nouveau type sauvegardé, la sérialisation binaire stocke les strings assemblyName et typeName dans le binaire. Lors de la désérialisation, ces informations sont utilisées pour obtenir le Type à désérialiser. Mais on peut insérer son code sous la forme d’une instance d’une classe dérivée de SerializationBinder. Son unique méthode (Type BindToType(string assemblyName, string typeName) ) se charge de trouver le bon type. Il est alors très simple de faire la substitution.

Il y a peine deux semaines, j’ai eu un besoin qui aurrait pu être trivial avec cette classe. J’ai renomé le namespace de base de tout un framework métier. Donc tous les types se sont retrouvés renomés de A.Namespace.TypeN en B.Namespace.TypeN. Evidement, des données sérialisées faisaient intervenir toute une arborescence de ces types (N allant de 1 à beaucoup). J’ai eu besoin de relire un fichier A avec les composants B. J’ai bien pensé automatiser le processus en réalisant une moulinette référençant A.dll et b.dll. Cette moulinette aurait su nativement désérialiser l’arborescence de A et sérialiser une arborescence de B, mais il restait à convertir toutes les instances des éléments de A en équivalent B. Soit un nombre important de fonction de conversion à écrire. SerializationBinder aurait permis de faire celà en quelques lignes…