2010-08-12 30 views
1

Je me demande pourquoi le type IntPtr n'est pas supporté par l'implémentation de XmlSerializer. Lorsque j'essaie de sérialiser une classe incluant un champ de type IntPtr, la sérialisation échoue en me disant que IntPtr n'est pas prise en charge et ignore ce membre.Sérialiser un IntPtr en utilisant XmlSerializer

Pour contourner ce problème, je traduis la valeur IntPtr à un Int64 ... mais est-ce une bonne idée? Cela devrait être, pour autant que je puisse le penser. Concrètement, j'ai besoin de sérialiser une poignée de fenêtre, qui est typée IntPtr dans le framework .NET. Est-ce que je fais bien?

+0

Avez-vous l'intention de désérialiser le handle de fenêtre sur le même système, dans le même environnement? Autrement dit, la poignée de la fenêtre sera-t-elle toujours valide lorsque vous la désérialisez? –

+0

Oui, bien sûr. Toutes les poignées du système peuvent être invalides à tout moment (c'est la raison pour laquelle la classe SafeHandle existe), car elles sont gérées par le système. Mais ceci est un autre sujet. – Luca

Répondre

3

La raison pour laquelle un IntPtr n'est pas sérialisable est qu'il n'a généralement aucun sens lorsque vous le supprimez de son environnement.

Si vous sérialisez une poignée de fenêtre, cela n'a de sens que si vous la désérialisez au même endroit alors que la fenêtre existe toujours. Si vous le désérialisez sur un autre ordinateur, dans une application différente ou après que la fenêtre a été supprimée, le handle n'a aucune signification. Donc, vous pouvez le convertir en un type qui est sérialisable, mais c'est à vous de vous assurer qu'il est toujours logique quand vous le désérialisez.

+0

Cet argument pourrait être applicable à toutes les informations, même une chaîne. Par exemple, une chaîne pourrait spécifier un nom de mémoire partagée, et cela pourrait être dénué de sens après la sérialisation. La sérialisation est capable de restaurer la configuration des bits de n'importe quel objet, et il est évident qu'un IntPtr a une séquence de bits, qui pourrait être sérialisée aussi ... – Luca

+0

@Luca: C'est bien sûr basé sur ce que les types de données sont destinés pour, pas ce qu'ils pourraient être (mal) utilisé pour. – Guffa

0

Pensez à IntPtr comme void *. Si vous voulez faire quelque chose d'utile avec cela, vous n'avez pas d'autre choix que de le lancer sur autre chose. Donc oui, le convertir en int64 pour le sérialiser est parfaitement raisonnable.