Pourquoi System.Windows.Forms.Control n’est-il pas marqué comme sérialisable?

Je ne suis pas en mesure de copier en profondeur UserControls car ils ne sont pas marqués comme sérialisables.

Quelle est la raison derrière cette conception?

La sérialisation d’un contrôle n’est pas le problème, c’est la désérialiser, ce qui est extrêmement difficile à faire correctement. On s’attend à ce que cela produise un clone exact du contrôle. C’est presque impossible à faire avec précision, il y a une quantité énorme d’état d’exécution associé à un contrôle. Pas seulement dans l’object de classe Control lui-même, mais également dans l’état interne de la fenêtre, indiquez que Windows ne vous autorise pas à accéder directement.

Mais le problème ultime est qu’il existe un état associé à l’instance de processus. Les propriétés internes importantes telles que le nom de classe de la fenêtre Windows et les clés d’accesseur de propriété secrète sont différentes d’une exécution du programme à l’autre. Recréer le contrôle lorsqu’il a été sérialisé dans une exécution précédente du programme, ou dans un autre programme, n’est donc pas possible.

Cela dit, le concepteur Winforms prend en charge la sérialisation des contrôles. Pas en octets, il génère du code . Code qui recrée le contrôle au moment de l’exécution, en ayant exactement le même aspect qu’au moment de la conception. Moins tout un tas de détails comme la taille et les couleurs, ils se retrouvent souvent différents sur une autre machine. Le gros avantage du concepteur est qu’il n’a besoin que de sérialiser l’état initial du contrôle, son état au moment du constructeur. Faire la même chose à tout moment par la suite, après que Windows ait créé la fenêtre du contrôle et lui ait envoyé un tas de messages, est un casse-tête beaucoup plus difficile à résoudre. C’est une fabrique de bogues. Et donc pas pris en charge.

Les contrôles utilisateur sont un élément visuel et, en tant que tel, pourquoi voudriez-vous jamais les sérialiser? Vous n’allez jamais les envoyer via un service WCF, ni les diffuser dans un référentiel de données. Si vous avez besoin de transmettre ou de stocker des contrôles utilisateur, vous devez alors stocker leurs propriétés de clé et les recréer si nécessaire.

Au lieu d’utiliser la sérialisation pour créer un clone, recommencez avec une méthode plus traditionnelle, telle que la copie manuelle de propriétés spécifiques sur des types connus, ou utilisez la reflection.

Vous pouvez sérialiser les contrôles mais pas via les sérialiseurs standard. Si vous souhaitez sérialiser un ou plusieurs contrôles d’un formulaire pour enregistrer la conception de formulaire et / ou d’autres propriétés de contrôle, vous pouvez utiliser la même sérialisation que celle utilisée par visual studio (via CodeDomSerializer), mais vous devez implémenter plusieurs classes (je pense au moins). IDesignerSerializationManager). Vous pouvez voir un échantillon ici

http://support.microsoft.com/default.aspx?scid=kb;en-us;813808

La sérialisation est dans la méthode SampleDesignerLoader de la classe Flush.

Dans la même méthode, il existe également une sérialisation dans un stream XML qui n’utilise pas les classes utilisées par Visual Studio.

Dans la même classe, il y a la désérialisation à partir de XML.