XML序列化包含列表的嵌套类

时间:2012-04-29 00:19:44

标签: c# xml serialization

我在C#中序列化嵌套类的列表时遇到了一个奇怪的问题。该类定义为

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定义为

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)但是当我从XML文件中读取时,我得到一个包含正确数量的项目的列表,但是都是空的(每个字符串中"")。路径工作正常

感谢您通过这一行文本; o)

1 个答案:

答案 0 :(得分:1)

public List<MessageEvent> Events;是一个字段,而不是属性。您需要为字段重复相同的过程。