2009-12-14 7 views
6

Je souhaite sérialiser un objet. J'ai cette structure de classe de base:C# Sérialisation de classes imbriquées

class Controller 
{   
    Clock clock;   

    public event EventHandler<ClockChangedEventArgs> ClockChanged;  

    public void serializeProperties() 
    { 
     using (FileStream stream = new FileStream(PROPERTIES_FILE, FileMode.Append, FileAccess.Write, FileShare.Write)) 
     { 
      IFormatter formatter = new BinaryFormatter(); 
      try 
      { 
       formatter.Serialize(stream, clock); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
      } 
     } 
    } 

    public void deserializeProperties() 
    { 
     using (FileStream stream = new FileStream(PROPERTIES_FILE, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read)) 
     { 
      IFormatter formatter = new BinaryFormatter(); 
      try 
      { 
       clock = (Clock)formatter.Deserialize(stream); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
       clock = new Clock(); 
      } 
      finally 
      { 
       clock.ClockChanged += new EventHandler<ClockChangedEventArgs>(clock_ClockChanged); 
      } 
     } 
    } 
} 

La classe Clock est définie comme suit:

[Serializable] 
public class Clock 
{ 
    ClockProperties[] properties; 
    int current; 
    bool isAnimated; 

    public event EventHandler<ClockChangedEventArgs> ClockChanged; 

    public Clock() 
    { 
     properties = new ClockProperties[2]; 
     properties[0] = new ClockProperties("t1"); 
     properties[1] = new ClockProperties("t2"); 
     properties[0].ValueChanged += new EventHandler(Clock_ValueChanged); 
     properties[1].ValueChanged += new EventHandler(Clock_ValueChanged); 
    } 
} 

Les ClockProperties sous-jacent:

[Serializable] 
public class ClockProperties 
{ 
    public event EventHandler ValueChanged; 

    int posX, posY; 
    string clock; 

    public ClockProperties(string name) 
    { 
     clock = name; 
    } 

    public void OnValueChanged(EventArgs e) 
    { 
     if (ValueChanged != null) 
     { 
      ValueChanged(this, e); 
     } 
    } 

    public string Clock 
    { 
     get { return clock; } 
     set { 
      if (!value.Equals(clock)) 
      { 
       clock = value; 
       OnValueChanged(EventArgs.Empty); 
      }    
     } 
    } 

    public int PosX 
    { 
     get { return posX; } 
     set { 
      if (!(value == posX)) 
      { 
       posX = value; 
       OnValueChanged(EventArgs.Empty); 
      } 
     } 
    } 

    public int PosY 
    { 
     get { return posY; } 
     set { 
      if (!(value == posY)) 
      { 
       posY = value; 
       OnValueChanged(EventArgs.Empty); 
      } 
     } 
    } 


} 

Lorsque je tente de sérialiser l'objet Clock avec le tableau inclus de ClockProperties, j'obtiens une exception que le Controller n'est pas marqué sérialisable. Honnêtement, je ne comprends pas pourquoi. J'ai supposé que je ne sérialise que l'objet Clock, et donc marque seulement cette classe et le ClockProperties comme Serializable. Est-ce que je manque quelque chose?

Répondre

8

En classe horloge marquent le ClockChangedEvent [field: NonSerialized]

+0

Merci, j'ai essayé '[NonSerialized]', comme je suis tombé dessus. Je ne savais pas à propos de cette syntaxe '[field: NonSerialized]'. Cela fonctionne maintenant comme prévu. – rdoubleui

+0

Nice, je ne savais pas à ce sujet. – Svish

2

L'événement sur l'horloge est probablement votre problème, puisqu'il s'agit d'une référence au contrôleur. .

Vous devez rendre l'événement ou son champ de support non sérialisable, et ça devrait aller.

+1

J'ai essayé, mais le peu qui manquait pour moi, n'a pas été couvert dans cet article. Pour les déclérations d'événements, il faut indiquer '[field: NonSerialized]', comme l'a suggéré Henrik. – rdoubleui

Questions connexes