2010-08-20 5 views
1

Avec une application que je suis en train de développer, j'ai rencontré le besoin de sérialiser certains objets métier dans un certain nombre de formats propriétaires différents. J'ai du mal à prendre une décision sur la meilleure façon d'aborder cela et j'aimerais avoir quelques opinions.Implémentation de la sérialisation personnalisée à plusieurs formats: ISerializable ou une solution personnalisée?

Je sais que .NET nous fournit l'interface ISerializable que je peux implémenter sur mes objets métier, mais j'ai du mal à comprendre comment cela fonctionnerait quand je devrais sérialiser à peut-être 3 formats différents? En plus de cela, je ne suis pas très enthousiaste à l'idée d'avoir tout le code spécifique à la sérialisation "gommant" mes beaux objets business propres - je préférerais confier cette responsabilité à un objet dédié. Cela semble logique aussi bien quand il y a un certain nombre de formats différents que les options de sérialisation pourraient alors être étendues dans le futur en étendant simplement une classe de base, ou en la modifiant sans éditer les objets métier eux-mêmes. Là encore, je préfère ne pas "réinventer la roue".

Je me demande quelle est votre expérience et vos opinions collectives dans des cas comme ceux-ci?

Est-ce que ISerializable est une option viable pour plusieurs formats? Ou est une classe personnalisée ou un service plus adapté à la tâche? Y a-t-il des motifs de conception ou d'autres caractéristiques de cadre couvrant cette zone?

+0

pouvez-vous élaborer un peu plus sur ce que ces formats pourraient être? Xml, CSV, etc.? – theburningmonk

+0

@theburningmonk. ISerializable peut vraiment fonctionner avec des formats qui incluent "quelque chose que nous n'avons pas encore inventé". –

+0

Bien sûr, ils sont des formats propriétaires. On a une représentation basée sur le texte en utilisant des codes spéciaux et des identifiants pour identifier les types de données et les variables, les deux autres sont des formats binaires. Pas de XML ou de CSV - j'aurais aimé que ce soit aussi simple! :) – nukefusion

Répondre

1

Vous pouvez utiliser ISerializable pour obtenir une forme de magasin intermédiaire générique des données pour chaque objet (SerializationInfo), puis vous pouvez implémenter trois gestionnaires distincts pour ce type intermédiaire afin de les transformer en forme finale. Personnellement, je ne voudrais certainement pas voir trois formes de code de sérialisation dans un seul objet métier.

Il peut être plus simple, en fonction du nombre et de la complexité de vos objets, de créer votre propre interface à laquelle chaque classe doit prendre en charge la sérialisation. Cela vous permet alors une flexibilité totale, au prix de ne pas être utilisable avec les bits de sérialisation standard.

1

sérialisation personnalisée comme .NET, sérialisation entièrement sur mesure, marquage juste des classes, et le marquage juste des classes et en ajoutant quelques modifications sont disponibles:

sérialisation personnalisé est utile lorsque:

  1. Un objet est totalement ou partiellement immuable (un ou plusieurs membres est readonly) et doit donc être désérialisé via un constructeur de toute façon (une méthode d'usine peut également fonctionner en appelant un constructeur existant bien sûr). Un graphique est complexe, mais une grande partie peut être simplifiée avec la connaissance du système (par exemple, je sais que je n'ai pas besoin de sérialiser complètement ce membre, je peux juste sérialiser suffisamment d'informations pour créer une nouvelle instance sur la désérialisation).
  2. Une classe polyvalente est utilisée de façon spécifique (bien, ils le sont toujours ...) et la connaissance de ces spécificités peut réduire la complexité du graphe
  3. Vous faites une XMLSeriazation d'une classe qui hérite ou implémente une classe de template ou un abstract paramétré par lui-même (ceci va dans une boucle infinie en mappant le graphe, au moins sur IEnumerable<T>, je ne sais pas si ça arrive pour toutes ces interfaces et je suis presque sûr que ça n'arrivera pas pour la sérialisation binaire - vraiment c'est un bogue et devrait b e fixe, mais pour le moment c'est là).
  4. Vous devez garantir la compatibilité en amont et/ou en aval avec les versions ultérieures de la classe (à vous de vous assurer que cela fonctionne, mais vous n'avez aucun espoir si vous n'êtes pas "là").
  5. Vous avez un membre d'une classe que vous ne pouvez pas modifier (cadre ou tiers fourni) qui n'est pas sérialisable, vous devez donc fournir votre propre méthode de sérialisation. ISerialisable fournira une abstraction (les choses nommées vont, les choses nommées sortent) qui sont utilisées à tour de rôle pour différents formats.

Si vous avez besoin d'un format très spécifique (par exemple sérialisé dans un modèle particulier) alors vous devrez peut-être regarder les autres interfaces (par exemple IXmlSerializable) pour être plus explicite dans l'utilisation des méthodes de sérialisation, ou ignorer .NET- fourni des techniques de sérialisation et de rouler vos propres moyens pour produire et analyser les différents formats. À l'autre extrême, vous pouvez simplement mettre l'attribut [Serializable] sur la classe et toute classe dont elle a un membre et qui vous donnera le comportement de sérialisation par défaut.

tweaks D'autres peuvent venir de mettre [NonSerialized] sur les membres qui ne devraient pas être sérialisés (que vous avez BigObject _big; int _bigID et l'accès à memoise _big par le chargement à elle basée sur _bigID du premier accès. Dans ce cas, vous pouvez serialise juste _bigID par marquage _big comme IDeserializationCallback non sérialisé. permet quelques réglages supplémentaires en informant votre classe quand il vient d'être créé par désérialisation.

0

on dirait que vous avez besoin d'un sérialiseur personnalisé pour chacun le format que vous souhaitez sérialiser votre objet. comme je l'ai mentionné dans mon commentaire, vous pouvez prendre le même objet et sérialiser avec le sérialiseur Json et il vous donnerait Une représentation Json de cet objet, sérialiser avec le sérialiseur XML et vous obtenez XML, etc

Donc pour chacun de vos formats, vous avez juste besoin d'un sérialiseur personnalisé qui peut sérialiser/désérialiser à partir de ce format.

Questions connexes