【问题标题】:XMLSerialization problem in WPFWPF中的XML序列化问题
【发布时间】:2011-11-19 17:31:58
【问题描述】:

假设我有以下课程:

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 经验。如果我提供任何其他有用的信息,请告诉我。

【问题讨论】:

    标签: c# wpf xaml xml-serialization


    【解决方案1】:

    这些解决了问题。

    • 在类顶部添加 [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】:

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

      单独执行此操作将阻止错误发生,但可能无法正确序列化字符串值。我对此不是 100% 确定,因为它可能能够序列化公共成员变量。

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

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

      [Serializable]     
      public class testClass     
      {         
          private string str;          
      
          public testClass()
          {             
          }     
      
          public string Str
          {
              get { return str; }
              set { str = value; }
          }
      } 
      

      编辑:为类添加了 public 修饰符。现在应该可以工作了。

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

      【讨论】:

      • 这没有帮助,它仍然给我同样的异常:(
      • 糟糕,当我剪切和粘贴该类未标记为 public 时,我没有注意到。公开它应该可以解决它。
      • 是的,将函数调用移到 Window 构造函数之外有点解决了这个问题。我已经切换到运行时序列化而不是 XML 序列化。我会再次尝试 XML 序列化来回复你。
      • 是的,在类的顶部添加 [Serializable()] 解决了这个问题。我是否在 Window 构造函数中调用该方法并不重要,但是是的,在构造函数之外调用它给了我一个更漂亮的异常跟踪:)
      【解决方案3】:

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

      你错过了:

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

      请确定您的 XAML 异常来自何处,但这个没有任何意义。

      【讨论】:

      • 任何链接都会很有用:) 谢谢!
      • ?抱歉,不 - 您希望我提供指向 .NET 核心文档的链接吗?检查 XmlRootAttribute 以开始使用 - 离开 Visual Studio 的 F1 可让您进入帮助系统。 XmlRoot、XmlElement等是你需要添加的属性。
      猜你喜欢
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多