如何使用 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?
我写了我的派生自 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?