3 votes

Pourquoi ai-je besoin de sérialiser en premier lieu ?

Alors, je travaille avec l'assemblage suivant, qui a les éléments suivants définis (assez inoffensifs):

public class QueryDefinition
{
    private List TheCurrentFilters = null;

    public List CurrentFilters
    {
        set { TheCurrentFilters = value; }
        get { return TheCurrentFilters; }
    }

    // autres codes

    public class QueryFilter
    {
        // les variables membres sont : sept chaînes publiques et deux entiers publics

        public override string ToString()
        {
            return FilterText;
        }
    }
}

Dans un autre assemblage, nous avons un UserControl :

public partial class QueryWizard : UserControl
{
    private List TheCurrentFilters = null;

    public List CurrentFilters
    {
        set { TheCurrentFilters = value; }
        get { return TheCurrentFilters; }
    }

    // autres codes
}

Code intéressant, mais c'est avec ça que je dois travailler.

Quoi qu'il en soit, si je passe à un autre projet (qui référence ce UserControl), crée un formulaire, puis ajoute le contrôle dans le formulaire, je reçois cette erreur :

'System.Runtime.Serialization.SerializationException: Type QueryDefinition+QueryFilter' in Assembly ... is not marked as serializable.'

Je n'utilise pas réellement de code de sérialisation, donc quelle partie de cette liste de QueryFilter est la raison de la SerializationException ?

J'ai utilisé la balise [Serializable], pour m'en débarrasser. Mais récemment, nous reconstruisions des projets (mise à niveau de Visual WebGUI) et maintenant je rencontre le problème "impossible de charger le type requis pour la désérialisation". Au lieu de résoudre ce problème, j'ai décidé d'essayer de comprendre pourquoi nous avons besoin des balises de sérialisation en premier lieu ! Merci.

2voto

Roger Alsing Points 5542

C'est parce que le designer essaie de sérialiser le contenu de la propriété "CurrentFilters" des usercontrols dans le code d'initialisation du formulaire.

Vérifiez l'attribut DesignerSerializationVisibility: http://msdn.microsoft.com/fr-fr/library/system.componentmodel.designerserializationvisibility.aspx

Si vous ne prévoyez pas de prendre en charge l'édition en mode design de la propriété CurrentFilters, la définir sur hidden devrait résoudre le problème (je pense, cela fait des lustres depuis que j'ai construit des contrôles WinForms)

2voto

Hans Passant Points 475940

Les valeurs actuelles des CurrentFilters sont sérialisées à l'aide de BinaryFormatter et stockées dans un fichier .resx. Vous ne voulez presque certainement pas que cela se produise. Pour commencer, vous prendrez une dépendance sur le numéro de version de l'assembly qui contient votre classe QueryFilter. Ce qui devrait expliquer l'exception "impossible de charger le type" que vous obtenez maintenant.

D'abord, découvrez comment les CurrentFilters ont fini par avoir des valeurs au moment de la conception. Vous devrez vous méfier des événements qui s'exécutent au moment de la conception. Les candidats typiques sont le constructeur et l'événement Load. Utilisez la propriété Control.DesignTime pour empêcher l'exécution du code.

Ensuite, assurez-vous que la valeur de la propriété ne soit pas persistée en appliquant un attribut :

 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 public List CurrentFilters
 {
 }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X