2009-12-14 88 views
6

我想序列化一個對象。我有這個基本的階級結構:C#嵌套類的序列化

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

時鐘類是這樣定義的:

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

底層ClockProperties:

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


} 

當我嘗試序列化對象Clock與包括陣列ClockProperties,我得到一個異常,Controller未標記爲可序列化。老實說,我不明白爲什麼。我假設我只序列化了Clock對象,因此只標記該類,而ClockProperties標記爲Serializable。我錯過了什麼嗎?

回答

8

在課堂時鐘標誌的ClockChangedEvent [字段:非序列化]

+0

謝謝,我試過'[NonSerialized]',因爲我偶然發現了它。不知道該語法'[field:NonSerialized]'。它現在按預期工作。 – rdoubleui 2009-12-14 13:36:11

+0

不錯,不知道那個。 – Svish 2009-12-14 13:43:06

2

時鐘上的事件可能是您的問題,因爲它是對控制器的引用。 That's a known "issue"

你需要使事件或其後臺字段不可序列化,你應該沒問題。

+1

我試過了,但是這是缺少對我來說一下,並沒有涉及該文章。正如Henrik所建議的那樣,對於事件欺騙,需要聲明'[field:NonSerialized]'。 – rdoubleui 2009-12-14 13:35:06