J'écris une application de bureau pouvant ouvrir / éditer / enregistrer des documents. P>
Ces documents sont décrits par plusieurs objets de types différents qui stockent des références les unes aux autres. Bien sûr, il existe un La question est de savoir comment enregistrer ce modèle de document dans un fichier. P>
document code> de la classe qui sert de racine de cette structure de données. P>
Ce dont j'ai besoin: h3>
Ce que je suis fatigué jusqu'à présent: h3>
xmlSerializer code> -> échoue aux premier et dernier critères. LI>
binaryséraliseur code> -> échoue dans le deuxième critère. P> li>
4 Réponses :
Je penserais que le XMLSerializer est votre meilleur pari. Vous ne serez pas en mesure de tout soutenir sur la liste de vos exigences sans un peu de travail dans les classes code> de votre document code> - mais l'architecture XMLSerializer vous donne des points d'extensibilité qui devraient vous permettre de toucher son mécanisme suffisamment profondément. faire à peu près n'importe quoi.
Utilisation du IxmlSerializable
interface - en mettant en œuvre que sur vos cours, vous devez être capable de faire à peu près n'importe quoi, vraiment. P>
L'interface expose fondamentalement deux méthodes - Readexml Et writxml p> à l'aide de ces deux méthodes, vous devriez pouvoir capturer les informations d'état nécessaires à partir de n'importe quel objet que vous pourriez souhaiter stocker et la transformer en XML qui peut Soyez persisté sur le disque - et désériorialisé dans un objet lorsque le temps vient! p> p>
Ok, mais comment pourrais-je obtenir une récursive pour travailler à l'aide de cette interface? Disons que j'ai des objets avec référence les uns les autres: A-> B-> C-> D-> A
xmlSerializer peut em> fonctionner pour vos premiers critères, mais vous devez fournir la récursivité des objets comme le contrôle TreeView. P>
Binaryformatter peut em> travail pour tous les 3 critères. Si une classe change, vous devrez peut-être créer un outil de conversion pour convertir des documents de format ancien à un nouveau format. Ou reconnaître un format plus ancien, désériorialiser à l'ancienne, puis enregistrer dans le nouveau format de votre ancienne classe autour pendant un peu de temps. P>
Cela aidera à couvrir
Les outils de conversion ressemblent à une approche propre. Mais pendant le développement, lorsque des changements se produisent en quelques minutes, cela ressemble à beaucoup de frais généraux. Est-il possible d'avoir un comportement par défaut? Comme "Ignorer les champs du fichier qui ne correspondent pas à l'objet" et "ajoutez la valeur par défaut si un champ est manquant dans le fichier".
Je sais que vous avez des attributs comme [xmlignore]. Je ne suis pas sûr de ce que la contrepartie binaire est. Vous devrez examiner comment décorer votre classe et vos membres ici: blog.kowalczyk .Info / article / sérialisement-in-c.html
Je pense que l'équivalent serait [non-séralisé]. Mais je ne vois pas comment cela aiderait à charger un fichier écrit par une version antérieure d'une classe.
Celui que vous n'avez pas essayé est DatacontractSerializer. Il existe un constructeur qui prend un paramètre Bool SRESSEObjectRefereciferces qui doit gérer les premiers critères. P>
NetDatacontractSerializer convient aux trois exigences. Mais la dernière exigence que l'on est probablement une mauvaise idée, car elle contredit le second (j'ai ajouté une «manipulation de types inconnus» à ce sujet). Le DatacontractSérialiseur semble être le meilleur choix.
Le sérialisateur de contrat de données WCF est probablement le plus proche de vos besoins, bien que non parfaits. p>
Il n'existe que la prise en charge limitée la compatibilité de em> (c'est-à-dire que les anciennes versions du programme peuvent lire des documents générés par une version plus récente). Les nouveaux champs sont pris en charge (via IexttenSiDaDataObject), mais de nouvelles classes ou de nouvelles valeurs d'énumjet non. P>
XMLSerializer n'échoue pas les derniers critères. Il suffit de transmettre les types supplémentaires dans le constructeur. Si vous avez une architecture plug-in, maintenez simplement une liste des types de béton réfléchis.