2009-12-14 20 views
6

Quiero serializar un objeto. Tengo esta estructura de clases básicas:C# Serialización de clases anidadas

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 clase de reloj se define así:

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

Los ClockProperties subyacentes:

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


} 

cuando intento para serializar el objeto Clock con el arreglo incluido de ClockProperties, recibo una excepción que el Controller no está marcado como serializable. Honestamente, no entiendo por qué. Supuse que solo serializo el objeto Clock y, por lo tanto, solo marqué esa clase y el ClockProperties como Serializable. ¿Me estoy perdiendo de algo?

Respuesta

8

En la clase de la marca del reloj del ClockChangedEvent [field: NonSerialized]

+0

Gracias, probé '[NonSerialized]', ya que me encontré con él. No sabía acerca de esa sintaxis '[field: NonSerialized]'. Funciona ahora como se pretendía. – rdoubleui

+0

Bueno, no sabía de eso. – Svish

2

El evento en el reloj es probablemente su problema, ya que es una referencia al controlador. That's a known "issue".

Debe hacer que el evento o su campo de respaldo no sean serializables, y debería estar bien.

+1

He intentado que, sin embargo, el poco que faltaba para mí, no se trata en este artículo. Para las declinaciones de eventos se necesita indicar '[field: NonSerialized]', como sugirió Henrik. – rdoubleui

Cuestiones relacionadas