如何使用 NetDataContractSerializer 序列化从 ConfigurationSection 派生的类型

How to serialize type derived from ConfigurationSection with NetDataContractSerializer

我写了我的派生自 ConfigurationSection 的类型,用 DataMember 标记了所有属性,用 DataContract 标记了 class,但是程序崩溃表明我不能从一个类型继承我的类型未标有 DataContract.

那么我如何将此序列化程序与 ConfigurationSection 一起使用?

[DataContract]
public sealed class MyConfig : ConfigurationSection
{
    [DataMember]
    [ConfigurationProperty("ConnectionTimeout", DefaultValue = 1000)]
    public int ConnectionTimeout
    {
        get { return (int)this["ConnectionTimeout"]; }
        set { this["ConnectionTimeout"] = value; }
    }
    ... // other values
}

好吧,我想如果你不能将序列化器与非数据契约一起使用 class,那么也许你应该将数据成员属性分离到另一个 class 中,它将在你的 ConfigurationSection 中聚合:

[DataContract]
public sealed class CustomConfig
{
   [DataMember]
    public int ConnectionTimeout {get;set;}
}

public sealed class MyConfig : ConfigurationSection
{
    private CustomConfig _customCfg = new  CustomConfig(){ConnectionTimeout = this.ConnectionTimeout};

    [ConfigurationProperty("ConnectionTimeout", DefaultValue = 1000)]
    public int ConnectionTimeout
    {
        get { return (int)this["ConnectionTimeout"]; }
        set { _customCfg.ConnectionTimeout = value;this["ConnectionTimeout"] = value; }
    }
    ... // other values
}

你可以用序列化器序列化 CustomConfig 实例

还有另一种方法 -- 不依赖于自动序列化,而是手动编写您的自定义序列化。由于 NetDataContractSerializer 支持它,您最终可以只使用一个类型和 2 个附加方法(更准确地说:用于序列化的额外方法和用于反序列化的构造函数)。

例如参见 [​​=16=]:When using ISerializable with DataContractSerializer, how do I stop the serializer from outputting type information?