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

本文关键字:嵌套 列表 序列化 包含 XML | 更新日期: 2023-09-27 18:32:29

我在 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)

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

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