2009-06-27 10 views
0

En ce moment, je suis sérialisation actuellement une classe comme ceci:Comment concevoir pour demander aux utilisateurs de nouvelles valeurs pour les propriétés des objets désérialisés?

class Session 
{ 
    String setting1; 
    String setting2; 
    ...etc... (other member variables) 

    List<SessionAction> actionsPerformed; 
} 

Où SessionAction est une interface qui a une seule méthode. Toutes les implémentations de l'interface SessionAction ont diverses propriétés décrivant ce que fait cette SessionAction spécifique.

Actuellement, je sérialiser cela à un fichier qui peut être chargé à nouveau en utilisant le sérialiseur binaire .Net par défaut. Maintenant, je veux sérialiser ceci à un modèle. Ce modèle sera simplement la liste des SessionActions sérialisées dans un fichier, mais lors du chargement en mémoire à un autre moment, je veux que certaines propriétés de ces SessionActions nécessitent une entrée de l'utilisateur (que je prévois de générer dynamiquement des contrôles GUI à la volée en fonction du type de propriété). En ce moment, je suis bloqué sur la détermination de la meilleure façon de le faire.

Y a-t-il un moyen de marquer certaines propriétés de sorte que, lors de l'utilisation de la réflexion, je puisse déterminer quelles propriétés doivent être saisies par l'utilisateur? Ou quelles sont mes autres options? N'hésitez pas à laisser des commentaires si quelque chose n'est pas clair.

Répondre

1

Pour info, je ne recommande pas d'utiliser BinaryFormatter pour tout ce que vous stockez à long terme; c'est très brittle between versions. C'est bien pour les messages de courte durée où vous savez que la même version sera utilisée pour la sérialisation et la désérialisation.

Je recommanderais l'un de: XmlSerializer, DataContractSerializer (3.0), ou pour le binaire rapide, protobuf-net; tous sont basés sur des contrats, donc beaucoup plus tolérant à la version.

Re la question; vous pouvez utiliser des choses comme Nullable<T> pour les types de valeur, et null pour les chaînes etc - et demander une entrée pour ceux qui sont null? Il existe d'autres routes impliquant des éléments tels que le modèle ShouldSerialize*, mais cela peut perturber les API de sérialisation.

+0

Donc, je devine avec les types Nullable, je devrais remplacer la méthode serialize pour la méthode de sérialisation que j'utilise? Si je fais cela, comment pourrais-je soutenir deux formes de sérialisation (l'une aurait toutes les propriétés et l'autre n'en aurait qu'un couple)? – llamaoo7

+0

Pour être honnête, j'aurais probablement différentes requêtes DTO pour les différents paquets de paramètres requis. –

0

Si vous savez depuis le début quelles propriétés auront SessionAction, vous devez implémenter IDeserializationCallback et mettre à ces attributs l'attribut [NonSerialized]. Lorsque vous implémentez la méthode OnDeserialization vous obtenez les nouvelles valeurs de l'utilisateur.

Questions connexes