0

我编写了派生自ConfigurationSection标记所有属性DataMember和类的类型DataContract,但是程序崩溃表明我无法从未标记的类型继承我的类型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
}
4

2 回答 2

2

好吧,我想如果您不能将序列化程序与非数据合同类一起使用,那么您应该将数据成员属性分离到另一个类中,该类将在您的 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 实例

于 2017-01-17T13:33:01.090 回答
0

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

例如参见帖子:当使用 ISerializable 和 DataContractSerializer 时,如何阻止序列化程序输出类型信息?

于 2017-01-23T10:20:54.810 回答