【问题标题】:How to serialize type derived from ConfigurationSection with NetDataContractSerializer如何使用 NetDataContractSerializer 序列化从 ConfigurationSection 派生的类型
【发布时间】:2017-06-01 13:36:17
【问题描述】:

我编写了派生自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
}

【问题讨论】:

  • 请给我们一些代码
  • @Übercoder,查看更新。

标签: c# serialization configuration netdatacontractserializer


【解决方案1】:

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

【讨论】:

  • 现在我使用类似的东西,我创建了具有完全相同值的包装器类型,在创建时,此包装器复制了 config 类型中的所有值。然而,这些是实现细节,一个脆弱的点是,你忘记了一次复制,你将在目标类型中拥有默认值。所以我正在寻找更自动化的东西。
  • 也许比使用反射来复制属性?如果您添加新属性,它们将被自动复制。
  • 谢谢,好主意。我等一下,如果我找不到任何东西,我会走这条路(并接受你的回答),好吗?
【解决方案2】:

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

如见帖子:When using ISerializable with DataContractSerializer, how do I stop the serializer from outputting type information?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2011-05-07
    • 2014-10-26
    • 1970-01-01
    相关资源
    最近更新 更多