2009-10-02 6 views
1

Je implémente une sérialisation xml basée sur Marc's answer.Comment devez-vous implémenter la sérialisation? (interface/convention wise)

Cela devrait-il faire partie de la classe elle-même, c'est-à-dire Apple.Serialize/Deserialize? Bien que la désérialisation soit statique dans ce cas, car vous ne disposez peut-être pas d'une instance pour l'appeler.

Ou devrais-je avoir une autre classe pour Serialize/Deserialize? Si oui, ceux-ci semblent être assez génériques? Comment devrais-je l'appeler? AppleSerializer semble très spécifique.

Ou quelque chose de mieux?

Répondre

1

Le code de sérialisation/désérialisation proposé par Marc n'est en aucun cas lié à votre objet Apple.

Donc, je suggère de les déclarer statiques, les rendre un peu plus génériques et les mettre dans une sorte de classe utilitaire. Comme si:

class Util 
{ 
    public static string SerializeToXml<T>(T o) where T: class 
    { 
    using (var sw = new StringWriter()) 
    { 
     var ser = new XmlSerializer(typeof(T)); 

     ser.Serialize(sw, o); 

     return sw.ToString(); 
    } 
    } 

    public static T DeserializeFromXml<T>(string xml) where T: class 
    { 
    using (var sr = new StringReader(xml)) 
    { 
     var ser = new XmlSerializer(typeof(T)) 

     return ser.Deserialize(sr) as T; 
    } 
    } 
} 
+0

-1 pour aucun bloc 'using'. –

+1

J'ai répondu à la question, je n'ai pas réécrit le code de sérialisation. –

+0

Alors disons, "-1 pour propager une erreur". Les gens copient et collent notre code, souvent sans le comprendre. Nous devons faire attention lorsque nous publions du code. –

1

Un défaut de la technique proposée par Yannick M. est qu'il vous lie à une implémentation particulière de la sérialisation XML. À tout le moins, la sérialisation doit être une opération d'instance virtuelle, de sorte qu'elle peut être remplacée par des classes dérivées.

De même, ne commencez pas à utiliser le XML Serializer. Utilisez plutôt le sérialiseur de contrat de données. Il est plus efficace et plus rapide, au prix de ne pas vous permettre de spécifier la structure exacte du XML généré (ce que vous n'avez pas besoin de faire du tout).

+0

Marc l'a déjà couvert dans sa réponse à la question initiale. (N'hésitez pas à le baisser aussi ;-) –

+0

Je suis d'accord qu'en théorie ne pas être lié à une implémentation est une bonne chose, cependant, une autre implémentation de sérialisation ne nécessiterait-elle pas de nouveaux Attributs sur l'objet que vous essayez de sérialiser? Ainsi votre code sera toujours un peu dépendant de l'implémentation? –

+0

Je voulais dire qu'une méthode 'Util.SerializeToXml' qui utilise toujours le XML Serializer vous relie à cette technologie. Je n'aime pas cacher une dépendance d'implémentation au milieu d'une classe d'utilitaires, où personne ne la cherchera. –

Questions connexes