2012-04-29 7 views
0

C#でネストされたクラスのリストをシリアライズするのに奇妙な問題があります。リストを含むネストされたクラスをXML直列化

public class MessageEvent 
{ 
    public MessageData Message = new MessageData(); 
    public MessageReaction Reaction = new MessageReaction(); 

    public override string ToString() 
    { 
     string tmp = this.Message.ToString() + " " + this.Reaction.ToString(); 
     return tmp; 
    } 
} 

public class MessageReaction 
{ 
    public string ReactionType; 
    public string Parameter; 

    public override string ToString() 
    { 
     string tmp = "Reaction: " + this.ReactionType + " " + 
        "Parameter: " + this.Parameter; 
     return tmp; 
    } 
} 

public class MessageData 
{ 
    public string ChannelName; 
    public string ChannelID; 
    public string SenderName; 
    public string MessageID; 
    public string Text; 

    public MessageData() 
    { } 

    public MessageData(string content) 
    { 
     this.ConvertFromString(content); 
    } 

    public void Clear() 
    { 
     this.ChannelName = ""; 
     this.ChannelID = ""; 
     this.MessageID = ""; 
     this.SenderName = ""; 
     this.Text = ""; 

    } 

    public void ConvertFromString(string msg) 
    { 
     int HeaderEnd = msg.IndexOf("]") + 1; 
     string Header = msg.Substring(0, HeaderEnd); 
     string Text = msg.Substring(HeaderEnd); 
     Header = Header.Replace("[", ""); 
     Header = Header.Replace("]", ""); 
     Header = Header.Replace("\",\"", "\""); 
     Header = Header.Replace("\",", "\""); 
     char[] Seperator = { '\"' }; 
     string[] message = Header.Split(Seperator); 
     this.ChannelName = message[2]; 
     this.ChannelID = message[1]; 
     this.MessageID = message[4]; 
     this.SenderName = message[3]; 
     this.Text = Text; 
    } 

    public void ConvertFromObject(object o) 
    { 
     MessageData tmp = (MessageData)o; 
     this.ChannelName = tmp.ChannelName; 
     this.ChannelID = tmp.ChannelID; 
     this.SenderName = tmp.SenderName; 
     this.MessageID = tmp.MessageID; 
     this.Text = tmp.Text; 
    } 

    public override string ToString() 
    { 
     return "ChannelID: " + this.ChannelID + " " + 
       "CannelName: " + this.ChannelName + " " + 
       "SenderName: " + this.SenderName + " " + 
       "MessageID : " + this.MessageID + " " + 
       "Message: " + this.Text; 
    } 
} 

それと奇妙な問題は、すべてのデータでクリアなXMLが得られた(データを保存するとき、それは完璧に動作することであるように、クラスは

public class Settings : XmlSerializable 
{ 
    private string mPath = ""; 
    public string Path 
    { 
     get { return mPath; } 
     set { mPath = value; } 
    } 

    [XmlArrayItem("ChatEventsAndReactions")] 
    public List<MessageEvent> Events; 
} 

public abstract class XmlSerializable 
{ 
    public virtual void Save(string path) 
    { 
     StreamWriter w = new StreamWriter(path); 
     XmlSerializer s = new XmlSerializer(this.GetType()); 
     s.Serialize(w, this); 
     w.Close(); 
    } 

    public virtual void Load(string path) 
    { 
     if (File.Exists(path)) 
     { 
      StreamReader sr = new StreamReader(path); 
      XmlTextReader xr = new XmlTextReader(sr); 
      XmlSerializer xs = new XmlSerializer(this.GetType()); 
      object c; 
      if (xs.CanDeserialize(xr)) 
      { 
       c = xs.Deserialize(xr); 
       Type t = this.GetType(); 
       PropertyInfo[] properties = t.GetProperties(); 
       foreach (PropertyInfo p in properties) 
       { 
        p.SetValue(this, p.GetValue(c, null), null); 
       } 
      } 
      xr.Close(); 
      sr.Close(); 

     } 
    } 
} 

として定義され、クラスMessageEventが定義されています)しかし、XMLファイルから読み込むと、正しい数の項目を持つリストが表示されますが、それらはすべて空です(すべての文字列で"")。パスは、テキストのこの壁を貫通して作業するための微

おかげで動作します; O)

答えて

1

public List<MessageEvent> Events;はフィールドではなく、プロパティです。プロパティの場合と同じように、フィールドの処理を繰り返す必要があります。

+0

うわー、どうしたらいいですか、どうもありがとう – Aseratis

関連する問題