7
votes

Sériatation pour le stockage de documents

J'écris une application de bureau pouvant ouvrir / éditer / enregistrer des documents.

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 document de la classe qui sert de racine de cette structure de données.

La question est de savoir comment enregistrer ce modèle de document dans un fichier.

Ce dont j'ai besoin:


1 commentaires

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.


4 Réponses :



1
votes

3 commentaires

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.



4
votes

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.


1 commentaires

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.



3
votes

Le sérialisateur de contrat de données WCF est probablement le plus proche de vos besoins, bien que non parfaits.

Il n'existe que la prise en charge limitée la compatibilité de (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.


0 commentaires