簡體   English   中英

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

[英]XML-serializing a nested class including a list

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

public List<MessageEvent> Events; 是一個字段,而不是一個屬性。 您需要對字段重復與屬性相同的過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM