2009-10-01 11 views
2

J'ai certains types que je veux sérialiser/désérialiser et générer une interface utilisateur basée sur l'objet sélectionné. L'interface utilisateur va également changer l'objet qui, à son tour, je devrai sérialiser pour le stocker dans mon application.Comment implémenter la sérialisation xml pour les types personnalisés?

Alors:

[obj_apple stored in the app] -> select obj_apple -> deserialize -> show in UI -> use the UI to change obj_apple -> deselect obj_apple -> serialize -> [obj_apple stored in the app] 

Les objets doivent être sérialisé/désérialisé et ces données doit être une chaîne. C'est pourquoi je pensais avoir un sérialiseur xml serait mieux.

Quel type de sérialiseur serait le meilleur? Et existe-t-il de bons exemples pour implémenter ceci pour les types personnalisés?

+1

(répondu à un commentaire) –

Répondre

1

Vous avez quelques choix pour les chaînes; xml, qui peut être fait simplement avec XmlSerializer (ou DataContractSerializer, mais qui offre beaucoup moins de contrôle sur le xml) ou JSON (JSON.net, etc).

Les classes typiques pour XmlSerializer chercheraient simplement comme:

public class Apple { 
    public string Variety {get;set;} 
    public decimal Weight {get;set;} 
    // etc 
} 

(note que je me attends à ce qui précède pour travailler le JSON.net aussi)

La classe ci-dessus devrait également fonctionner correctement dans les données de liaison scénarios etc, grâce aux propriétés.

Vous sérialiser:

Apple obj = new Apple { Variety = "Cox", Weight = 12.1M}; 
    XmlSerializer ser = new XmlSerializer(typeof(Apple)); 

    StringWriter sw = new StringWriter(); 
    ser.Serialize(sw, obj); 
    string xml = sw.ToString(); 

    StringReader sr = new StringReader(xml); 
    Apple obj2 = (Apple)ser.Deserialize(sr); 

mais vous pouvez personnaliser le xml:

[XmlType("apple"), XmlRoot("apple")] 
public class Apple { 
    [XmlAttribute("variety")] 
    public string Variety {get;set;} 
    [XmlAttribute("weight")] 
    public decimal Weight {get;set;} 
    // etc 
} 

DataContractSerializer est idéalement plus comme:

[DataContract] 
public class Apple { 
    [DataMember] 
    public string Variety {get;set;} 
    [DataMember] 
    public decimal Weight {get;set;} 
} 
+0

Merci Marc, des exemples très sympas. –

+0

Btw Marc, puis-je utiliser XmlSerializer ser = new XmlSerializer (typeof (obj.GetType())); Je me demande simplement si typeof a un avantage dans ce cas? –

+1

nouveau XmlSerializer (obj.GetType()); –

Questions connexes