2009-12-14 20 views
6

Desidero serializzare un oggetto. Ho questa struttura di classe base:C# Serializzazione di classi nidificate

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 è definita in questo modo:

[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); 
    } 
} 

I ClockProperties sottostanti:

[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); 
      } 
     } 
    } 


} 

quando provo a serializzare l'oggetto Clock con la matrice inclusa di ClockProperties, ottengo un'eccezione che lo Controller non è contrassegnato come serializzabile. Onestamente, non capisco perché. Presupposi che serializzo solo l'oggetto Clock e pertanto contrassegno solo tale classe e lo come Serializable. Mi sto perdendo qualcosa?

risposta

8

In classe dell'orologio segnano il ClockChangedEvent [field: NonSerialized]

+0

Grazie, ho provato '[NonSerialized]', mentre mi sono imbattuto in esso. Non conoscevo questa sintassi '[field: NonSerialized]'. Funziona ora come previsto. – rdoubleui

+0

Bello, non lo sapevo. – Svish

2

È probabile che l'evento sull'orologio sia un problema, poiché si tratta di un riferimento al controller. That's a known "issue".

È necessario rendere l'evento o il suo campo di supporto non serializzabile, e si dovrebbe andare bene.

+1

ho provato che, per quanto il bit che mancava per me, non era coperto in tale articolo. Per le declinazioni di eventi è necessario indicare '[field: NonSerialized]', come suggerito da Henrik. – rdoubleui

Problemi correlati