我有一个带有字符串的类和一个由我的字符串中的单词填充的列表。当保存一切看起来很好,程序工作正常。 XML文件看起来也很好。
但是,一旦我重新加载我的程序并因此从XML文件加载我得到“string = null”错误。这是我的班级:
public class Wortarten : INotifyPropertyChanged
{
public Wortarten(string quest)
{
strLatein = quest;
}
public Wortarten()
{ }
private string _strLatein;
public string strLatein { set { this._strLatein = value; NotifyPropertyChanged("listLatein"); } get { return this._strLatein; } }
private List<string> _listLatein = new List<string>();
public List<string> listLatein
{
set
{
this._listLatein = value;
}
get
{
_listLatein.Clear();
string[] sep = new string[] { " ", ", " };
string[] lWorte = strLatein.Split(sep, StringSplitOptions.None);
foreach (string wort in lWorte)
{
_listLatein.Add(wort);
}
return _listLatein;
}
}
protected void NotifyPropertyChanged(String propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
这是XML-File中的原始数据。
<Wortarten>
<strLatein>Wort1, Wort2, Wort3, Wort4, Wort5.</strLatein>
<listLatein>
<string>Wort1</string>
<string>Wort2</string>
<string>Wort3</string>
<string>Wort4</string>
<string>Wort5.</string>
</listLatein>
</Wortarten>
确切的错误很简单:“strLatein null”。
那么,为什么strLatein在这里为null?我知道搞砸了吗? 编辑:错误显示在此行中,但仅在XMLLoad上,在我运行的程序中添加值时,它正在运行而没有错误。因此,XMLSave保存了正确的值,......:
string[] lWorte = strLatein.Split(sep, StringSplitOptions.None);
请注意我的程序还有3个课程,一切正常。装载和保存已经工作了几个星期。只有这个新类似乎有这个问题,但我没有任何其他类实现iNotifyPropertyChanged。所以它很可能与此有关。
答案 0 :(得分:0)
不要序列化列表。这只是冗余数据。此外,与方法不同,属性不应该像数据生成器一样。
答案 1 :(得分:0)
也许您应该考虑使用XML或JSON等标记语言进行序列化和反序列化,然后将文本存储到文件中。它可以使你的工作更轻松。序列化和反序列化也可以极大地帮助您在未来进行扩展。它可以很容易地为对象添加更多变量。
以下是使用简单汽车对象进行XML序列化的示例:
public void WriteFile(Car testCar)
{
string path = "c:\temp\testCarPath.xml";
XmlSerializer serializer = new XmlSerializer(typeof(Car));
StreamWriter file = new StreamWriter(path);
serializer.Serialize(file, testCar);
file.Close();
}
public Car ReadFile()
{
Car testCar;
string path = "c:\temp\testCarPath.xml";
XmlSerializer serializer = new XmlSerializer(typeof(Car));
StreamReader reader = new StreamReader(path);
testCar = (Car)serializer.Deserialize(reader);
reader.Close();
return testCar;
}