我在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)
答案 0 :(得分:1)
public List<MessageEvent> Events;
是一个字段,而不是属性。您需要为字段重复相同的过程。