2008-10-01 11 views
6

J'ai créé un composant non visuel en C# qui est conçu comme un espace réservé pour les métadonnées d'un formulaire.
Le composant possède une propriété qui est une collection d'objets personnalisés, cet objet est marqué comme Serializable et implémente le GetObjectData pour la formation de sérilisation et le profilage public pour la désérialisation. Dans le fichier resx pour le formulaire, il générera des données binaires pour stocker la collection, mais chaque fois que je fais une modification à la classe sérialisée, je reçois des erreurs de concepteur et j'ai besoin de supprimer les données manuellement du fichier resx et puis recréer ces données.Sérialisation de la conception en C#

J'ai essayé de changer le constuctor d'avoir un bloc try/catch autour de chaque propriété dans la classe

try 
{ 
    _Name = info.GetString("Name"); 
} 
catch (SerializationException) 
{ 
    this._Name = string.Empty; 
} 

mais il se bloque encore. La dernière erreur que j'ai eue était que je devais implémenter IConvertible.

Je préférerais utiliser la sérialisation xml parce que je peux au moins le voir, est-ce possible pour une utilisation par le concepteur?

Existe-t-il un moyen de rendre la sérialisation plus stable et moins résistante aux changements?

Edit:
Plus d'informations ... peut-être meilleure description
J'ai une classe qui hérite de composants, il a une propriété qui est une collection de règles. Le RulesCollection semble devoir être marqué comme sérialisable, sinon il ne conserve pas ses membres. La classe Rules est également un composant avec l'attribut DesignTimeVisible (false) pour l'afficher dans la barre d'état des composants, cette classe n'est pas marquée Serializable. Si la collection marquée comme Serializable génère des données binaires dans le fichier resx (ce qui n'est pas l'idéal), l'EDI signale que la classe Rules n'est pas sérialisable.

Je pense que ce problème dépasse la simple question. Donc, je vais probablement le fermer prochainement.
Si quelqu'un a des liens vers quelque chose de similaire qui aiderait beaucoup.

Répondre

2

J'ai depuis découvert où je me trompais.

Le composant I implémente une collection personnalisée (héritée de CollectionBase), j'ai changé cela en List et ajouté l'attribut DesignerSerializationVisibility (DesignerSerializationVisibility.Content) à la propriété List, cette liste est également en lecture seule. Cela produirait alors du code pour générer toutes les propriétés des composants et toutes les entrées de la liste.

La classe stockée dans la liste n'a pas besoin d'attributs particuliers ou doit être sérialisable.

private List<Rule> _Rules; 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
public List<Rule> Rules 
{ 
    get { return _Rules; } 
} 
2

Vous souhaiterez peut-être essayer l'approche alternative de tout faire pour sérialiser en tant que code généré. Faire cela est très facile. Implémentez simplement votre classe non visuelle à partir de Composant. Ensuite, exposez votre collection comme vous l'êtes déjà mais assurez-vous que chaque objet placé dans la collection est lui-même dérivé de Composant. En faisant cela, tout est généré par le code.

+0

Il semble que cette méthode produit également des données binaires sérialisés, plus tous les objets de la collection est représentée sur le plateau des composants – benPearce

+0

ÉVIter apparaissant dans le plateau à l'aide ... [ToolboxItem (false)] ... sur la classe. J'utilise cette approche tout le temps et je ne reçois pas de données binaires. Donc, vous devez faire quelque chose qui force cela à se produire. Pouvez-vous poster un extrait de code? –

2

Pourriez-vous mettre plus de code de la classe qui a le problème de sérialisation, peut-être le constructeur et la propriété pour faire référence aux variables que vous utilisez.

Juste une remarque: J'ai eu beaucoup de problèmes avec le concepteur visuel et la génération de code, si j'ai une propriété sur un contrôle alors généralement je mets

[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden) ]

sur la propriété et de gérer l'initialisation moi-même.

+0

où abouts gérez-vous l'initialisation? Y a-t-il une interface requise ou est-ce dans le constructeur? – benPearce

+0

Dans le constructeur ou dans l'événement OnLoad sur le formulaire – Jiminy

+0

Votre suggestion a fonctionné pour les gars ici au travail. Merci! –

Questions connexes