0

J'ai écrit mon type dérivé de ConfigurationSection marqué toutes les propriétés avec DataMember et classe avec DataContract, mais tombe en panne programme indiquant que je ne peux pas hériter mon type d'un type non marqué avec DataContract. Alors comment utiliser ce sérialiseur avec ConfigurationSection?Comment sérialiser type dérivé de ConfigurationSection avec NetDataContractSerializer

[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 
} 
+0

S'il vous plaît nous montrer un code –

+0

@ Übercoder, voir la mise à jour. – astrowalker

Répondre

0

Il existe une autre méthode: au lieu de vous fier à la sérialisation automatique, écrivez votre sérialisation personnalisée manuellement. Puisque NetDataContractSerializer le supporte, vous pouvez vous retrouver avec un seul type avec 2 méthodes supplémentaires (plus précisément: méthode supplémentaire pour la sérialisation et constructeur pour la désérialisation).

Comme par exemple voir le message: When using ISerializable with DataContractSerializer, how do I stop the serializer from outputting type information?

2

Eh bien, je suppose que si vous ne pouvez pas utiliser le sérialiseur avec classe contrat de données non que peut-être vous devez séparer les propriétés des membres de données dans une autre classe qui agrégée dans votre 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 
} 

Que vous pouvez sérialiser Instance CustomConfig avec votre sérialiseur

+0

Pour l'instant j'utilise quelque chose de similaire, je crée le type wrapper, qui a exactement les mêmes valeurs, à la création de ce wrapper copie toutes les valeurs du type 'config'. Cependant, ce sont des détails de mise en œuvre, un point fragile est, vous oubliez une fois sur la copie et vous aurez une valeur par défaut dans le type cible. Donc je cherche quelque chose de plus automatique. – astrowalker

+1

Peut-être que d'utiliser la réflexion pour copier les propriétés? Que si vous ajoutez de nouvelles propriétés, elles seront copiées automatiquement. – VitaliyK

+0

Merci, bonne idée. J'attends un peu, si je ne trouve rien, j'irai dans cette direction (et j'accepte ta réponse), d'accord? – astrowalker