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?
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
Bueno, no sabía de eso. – Svish