【问题标题】:XMLSerialize ExceptionXML序列化异常
【发布时间】:2023-03-16 09:46:01
【问题描述】:

我正在序列化一个类,但出现以下异常:

您必须在 System.Configuration.SettingsPropertyCollection 上实现默认访问器,因为它继承自 ICollection。

当下面一行被执行时:

XmlSerializer xs = new XmlSerializer(typeof(CustomConfiguration));

有什么帮助吗?

public class CustomConfiguration : ConfigurationObjectBase 
{ 

         public CustomConfiguration () { //DO NOTHING. } 

         [User] 
         public uint Version 
         { get { return ((uint)(this["Version"])); } 
           set { this["Version"] = value; } 
}

} 

ConfigurationObjectBase 派生自 System.configuration.ApplicationSettingsBase

【问题讨论】:

  • 你能展示你的CustomConfiguration类的任何版本吗(特别是继承等)?
  • public class CustomConfiguration : ConfigurationObjectBase { public CustomConfiguration () { //什么都不做。 } /// /// 版本 /// [User] public uint Version { get { return ((uint)(this["Version"])); } 设置 { this[“版本”] = 值; } } } ConfigurationObjectBase 派生自 System.configuration.ApplicationSettingsBase
  • 我能问一下你为什么要序列化这个吗?看起来有点奇怪。

标签: c# winforms xml-serialization


【解决方案1】:

“默认访问器”是返回集合对象的特殊属性 它的索引。例如:

[Serializable()]
public class IntList : ICollection {

    // Default Accessor Implementation
    public int this[int index] {
        get {

            return 0;
        }
        set { /* Do Nothing */ }
    }
}

因此无法在现有的第三方类中实现。对 ApplicationSettings 使用 xml 序列化是非常糟糕的主意,使用 Save()、Reload() 和 Reset() 方法,或者使用您自己的不是从 ApplicationSettingsBase CustomConfiguration 类派生的方法。

【讨论】:

    【解决方案2】:

    你必须有一个默认构造函数,即不带任何参数的构造函数,像这样......

    class foo
    {
        public foo() {}
    }
    

    如果您尝试序列化的类没有,XMLSerializer 会抛出该异常。如果您尝试序列化内置类,则必须派生自己的类或创建包装类。

    【讨论】:

    • 注意类型是System.Configuration.SettingsPropertyCollection...不容易编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多