1

Pour notre projet Silverlight (SL4), j'utilise un modèle qui peut contenir des listes (IList<AnotherModel>). Selon les règles de l'art et la règle CA2227:CollectionPropertiesShouldBeReadOnly , les propriétés IList n'ont pas de paramètre public. Nous sérialisons le modèle en utilisant le DataContractSerializer qui fonctionne. Mais lorsque j'essaie de désérialiser, une exception SecurityException est levée par la méthode ReadObject(Stream) de DataContractSerializer, se plaignant que la propriété target (pointant vers la propriété IList) ne peut pas être définie en raison d'un paramètre public manquant.Silverlight: DataContractSerializer ne peut pas gérer les propriétés de collection en lecture seule

Depuis le DataContractSerializer est scellé et ne extensible, ni souple, je vois actuellement donc aucune chance d'ajouter une sorte de règles supplémentaires qui permettent de désérialiser le ILists en utilisant une boucle foreach sur la méthode Add() ou une autre méthode de transfert des objets de collection . J'ai aussi essayé de creuser dans la source DataContractSerializer (en utilisant Reflector) pour créer une petite fourche mais il semblerait que je devrais creuser très profondément et la réplication de classes entières de sérialisation ne semble pas être une solution viable.

Voyez-vous une autre chance de sérialiser une liste sans setter public en utilisant le DataContractSerializer?

Merci beaucoup d'avance pour vos idées!


MISE À JOUR
résolu à l'aide XmlSerializer.


Thomas

Répondre

1

Dans notre cas, nous avons découvert que nous n'étions pas strictement lié à la DataContractSerializer, et il est intéressant, le XmlSerializerpris en charge par sérialisation de lecture seule ILists! En fait, même n'autorise pas un paramètre public pour l'interface IList dans ce cas (ne peut pas désérialiser la propriété d'interface) mais (dé) sérialiser les éléments ILists fonctionne comme un charme.

changer seulement pour nous ajoutais [XmlInclude] attributs, en plus de [KnownType] (et bien sûr, en remplaçant les quelques lignes de DataContractSerializer.WriteObject(...)-XmlSerializer.Serialize(...).

Merci pour votre soutien! =)

1

Utilisez les types de béton (mutables) et donner DCS ce qu'il veut.

Cela fonctionne bien pour moi (habituellement seulement spécifier les types concrets dans les classes DataContractSerializable). L'approche complète de la sérialisation générique est un lavage et vient avec cavaets - choisissez vos batailles. Vous pouvez également utiliser une autre approche, telle que ISerializable (uhg).

+0

Merci! (J'ai choisi une autre solution) – thmshd