【问题标题】:XMLSerializer returning string as null after saving it itselfXMLSerializer 在自己保存后将字符串返回为 null
【发布时间】:2014-04-26 21:14:31
【问题描述】:

我有一个带有字符串的类和一个由我的字符串中的单词填充的列表。保存后一切看起来都很好,并且程序运行正常。 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 文件中的原始数据。

   <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 在这里为空?知道我在哪里搞砸了吗? 编辑:错误显示在这一行中,但仅在 XMLLoad 上,在我正在运行的程序中添加值时,它可以正常工作而没有错误。因此 XMLSave 保存了正确的值,...:

string[] lWorte = strLatein.Split(sep, StringSplitOptions.None);

请注意,我的程序还有 3 个类,并且一切正常。加载和保存已经工作了几个星期。只有这个新类似乎有这个问题,但是我没有任何其他实现 iNotifyPropertyChanged 的​​类。所以很有可能和那个有关。

【问题讨论】:

    标签: c# xml xml-serialization inotifypropertychanged


    【解决方案1】:

    不要序列化列表。这只是冗余数据。此外,与方法不同,属性不应充当数据生成器。

    【讨论】:

    • 我同意冗余数据的事情。尚未完成优化过程。从序列化中删除列表并没有解决问题。出现了完全相同的错误,显然 strLatein 变量为空。
    【解决方案2】:

    也许您应该考虑使用 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;
    }
    

    【讨论】:

    • 嗯,这正是我所做的。使用 XMLSerializer。问题是 StreamReader 部分,它只是为它在一秒钟前保存自己的字符串返回 null。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2021-03-24
    • 1970-01-01
    • 2020-10-02
    • 2015-02-12
    • 2020-09-24
    • 2016-10-13
    相关资源
    最近更新 更多