WPF中的XML序列化问题

时间:2011-09-18 16:03:06

标签: c# wpf xaml xml-serialization

假设我有以下课程:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NetworkSwitcher
{
    [Serializable]
    class testClass
    {
        public string str;

        public testClass(string _str)
        {
            this.str = _str;
        }
    }
}

现在,当我尝试执行以下操作时,它会抛出System.Windows.Markup.XamlParseException。

testClass tc = new testClass("Hello World");
XmlSerializer xsl = new XmlSerializer(typeof(testClass));
TextWriter WriteFileStream = new StreamWriter(@"C:\NSProfiles.xml");
xsl.Serialize(WriteFileStream, tc);
WriteFileStream.Close();

如果我使用简单的String类型对象而不是tectClass,代码可以正常工作:

string data = "hello world";
XmlSerializer xsl = new XmlSerializer(typeof(String));
TextWriter WriteFileStream = new StreamWriter(@"C:\NSProfiles.xml");
xsl.Serialize(WriteFileStream, data);
WriteFileStream.Close();

所以我猜问题是在类定义中,我该如何解决?我使用的是WPF,而不是WinForms,我没有任何WPF或XMLSerialization的经验。如果我提供任何其他有用的信息,请告诉我。

3 个答案:

答案 0 :(得分:1)

要修复错误,请在类中添加默认构造函数(不带参数的构造函数)。

单独执行此操作将停止发生错误,但可能无法正确序列化字符串值。我不是百分之百确定,因为它可以能够序列化一个公共成员变量。

如果没有,您将需要为字符串值添加公共属性。

此类的更“标准”实现可能如下所示。您可以使用第二个构造函数,也可以使用setter来设置值:

[Serializable]     
public class testClass     
{         
    private string str;          

    public testClass()
    {             
    }     

    public string Str
    {
        get { return str; }
        set { str = value; }
    }
} 

修改:在课程中添加了公共修饰符。现在应该工作。

另外,我猜你正在调用在Window的构造函数中抛出异常的代码?这是我可以看到这会引发XAML异常的唯一原因。构造函数中的错误包含在该XAML异常中,因此在这些情况下,您需要查看InnerException以查找问题。

答案 1 :(得分:0)

这些解决了这个问题。

  • 在班级上添加[Serializable()]。
  • 添加默认构造函数。
  • 将公共类修饰符添加到类中。

    using System;
    using System.Linq;
    using System.Text;
    using System.Collections.Generic;
    
    namespace NetworkSwitcher
    {
    
        [Serializable()]
        public class testClass
        {
            private string str;
    
            public string _str
            {
                get { return str; }
                set { str = value; }
            }
    
            public testClass()
            {
                //Default
            }
        } 
    }
    

答案 2 :(得分:-2)

开始阅读有关Xml序列化的文档。

你错过了:

  • 字符串的公共属性
  • Xml序列化的所有属性都可以使用。

Nlot确定你的XAML异常来自哪里,但这个没有意义。

相关问题