0

Cela devrait être plutôt simple, mais après avoir désérialisé mes objets métier en utilisant DataContractSerializer, toutes les collections personnalisées à l'intérieur de ces collections sont passées en lecture seule.Après la désérialisation à l'aide de DataContractSerializer, la collecte est en lecture seule

Pour être exact, j'essaie de manipuler la collection après la désérialisation en échangeant les éléments à l'intérieur de la collection, mais cela crée une exception en disant que la collection est en lecture seule. Cependant, avant la sérialisation, tout va bien.

Une exception non gérée du type 'System.NotSupportedException' a eu lieu dans mscorlib.dll Informations complémentaires: Collection est en lecture seule.

Voici comment j'ai décoré ma classe de collection personnalisée.

[Serializable] 
[DataContract] 
[KnownType(typeof(RuleBase))] 
[KnownType(typeof(RuleSet))] 
public class GenericRuleCollection : ObservableCollection<IRule> 
{ 
    //... 
} 

C'est ainsi que j'ai décoré ma classe d'objets de gestion.

[Serializable] 
[DataContract] 
public class RuleSet : GenericRuleContainer 
{ 
    //... 
} 

[Serializable] 
[DataContract(IsReference = true)] 
public abstract class GenericRuleContainer : GenericRule, IRuleContainer 
{   
    private GenericRuleCollection _children;  
    [DataMember] 
    public GenericRuleCollection Children 
    { 
     get { return _children; } 
     set { SetProperty(ref _children, value); } 
    } 
    //... 
} 

sérialisation et morceau de code désérialisation:

public class DataContractSerializer<T> 
{ 
    public void SerializeToFile(string fileName, T obj) 
    { 
     var serializer = new DataContractSerializer(typeof(T)); 
     using (FileStream fs = File.Open(fileName, FileMode.Create)) 
     {     
      serializer.WriteObject(fs, obj); 
     } 
    } 

    public T DeserializeFromFile(string fileName) 
    { 
     var serializer = new DataContractSerializer(typeof(T)); 
     using (FileStream fs = File.Open(fileName, FileMode.Open)) 
     { 
      object s2 = serializer.ReadObject(fs); 
      return (T)s2; 
     } 
    } 
} 
+0

pouvez-vous s'il vous plaît ajouter un peu plus de code pour la structure de l'objet métier et le code de désérialisation? –

+0

@RajaNadar, j'ai ajouté un peu plus de code –

Répondre

0

bien après quelques recherches au hasard sur google je pouvais en mesure de résoudre ce problème en changeant la décoration d'attribut [DataContract]-[CollectionDataContract] sur ma classe de collection personnalisée .

[Serializable] 
[CollectionDataContract] 
[KnownType(typeof(RuleBase))] 
[KnownType(typeof(RuleSet))] 
public class GenericRuleCollection : ObservableCollection<IRule> 
{ 
    //... 
}