2010-03-19 3 views
3

J'ai utilisé la sérialisation .NET par défaut pour une classe avec un membre System.Drawing.Color. Le code est maintenant utilisé par les gens, et j'ai besoin d'ajouter un membre supplémentaire à la classe, mais je désérialise toujours les anciennes versions.Sérialisation de System.Drawing.Color dans .NET

J'ai donc essayé la méthode standard: L'interface ISerializable, en utilisant les méthodes SerializationInfo pour obtenir les membres int et string. Le problème: Ma classe a également un membre System.Drawing.Color, mais SerializationInfo ne fournit pas une méthode "GetColor" lisant ce type de données. J'ai essayé de l'obtenir comme un int et comme une chaîne de caractères, et de le lancer sur System.Drawing.Color, mais pas de chance.

Est-ce que quelqu'un sait comment désérialiser un System.Drawing.Color de SerializationInfo?

Répondre

1

L'utilisation de ISerializable n'est pas recommandée pour gérer les versions. Le [OptionalField] est, les tenants et aboutissants sont bien décrits dans ce MSDN library article.

Répondre à votre question: SerializationInfo.GetValue ("fieldName", typeof (Color)) devrait vous donner la couleur. Vous devrez convertir la valeur de retour.

+0

Merci pour les réponses. Malheureusement [OptionalField] ne fonctionne qu'avec le BinaryFormatter (j'utilise le SoapFormatter). Votre suggestion GetValue compilée, mais maintenant je reçois l'exception: "Top Object ne peut pas être instancié pour l'élément 'foreColor'" (foreColor est l'élément que j'essaye de désérialiser.) Une idée de ce qui cause cette erreur, ou une alternative approches? Merci! – user20493

1

J'ai utilisé quelque chose comme ça dans le passé.

<Xml.Serialization.XmlIgnore()> Public BackColour As Drawing.Color 

     Public Property xmlBackColour() As Integer 
      Get 
       Return BackColour.ToArgb 
      End Get 
      Set(ByVal value As Integer) 
       BackColour = Drawing.Color.FromArgb(value) 
      End Set 
     End Property