Maison > développement back-end > C++ > Comment implémenter efficacement IXMLSerializable dans .NET?

Comment implémenter efficacement IXMLSerializable dans .NET?

Barbara Streisand
Libérer: 2025-01-27 14:41:10
original
758 Les gens l'ont consulté

How to Effectively Implement IXmlSerializable in .NET?

Implémentation de IXmlSeriallessly dans .NET : meilleures pratiques et directives

Lors du traitement de données XML dans .NET, les développeurs peuvent rencontrer des situations dans lesquelles ils doivent implémenter l'interface IXmlSerializable. Cette interface fournit un contrôle de bas niveau sur le processus de sérialisation et de désérialisation, permettant d'affiner le comportement pour des types de données spécifiques.

Méthode GetSchema

Un aspect clé de la mise en œuvre de IXmlSerializable est la méthode GetSchema. Comme indiqué dans la documentation MSDN, cette méthode doit renvoyer null. La raison en est que le framework lui-même est chargé de fournir les informations de schéma XML pour l'objet.

Méthode ReadXml

Lors de la désérialisation d'un objet, la méthode ReadXml doit analyser les données XML et remplir les propriétés de l'objet en conséquence. Voici quelques bonnes pratiques :

  • Élément Wrapper : Le framework positionne le lecteur XML au début d'un élément wrapper qui encapsule les données de l'objet. Votre implémentation doit lire et traiter les propriétés et sous-éléments de l'objet dans ce wrapper.
  • Lire en dehors du wrapper : Après avoir traité l'élément enveloppé, votre implémentation doit également lire la balise de fermeture de l'élément. Cela garantit que le lecteur XML est prêt à lire les éléments suivants du document XML.

Méthode WriteXml

Dans la méthode WriteXml, les données sérialisées sont écrites dans le document XML. Voici quelques lignes directrices :

  • Élément Wrapper : le framework gère la création d'un élément wrapper qui contient la représentation XML d'un objet. Votre implémentation doit se concentrer sur l'écriture d'attributs et de sous-éléments à l'intérieur de ce wrapper.
  • Éviter les wrappers : Contrairement à ReadXml, il n'est pas nécessaire d'écrire des éléments d'habillage dans WriteXml. Le framework gérera cela automatiquement.

Gestion des sous-objets

Concernant les objets enfants, votre implémentation est responsable de :

  • Sérialisation : Dans WriteXml, écrivez la représentation XML de chaque objet enfant.
  • Désérialisation : Dans ReadXml, créez des instances d'objets enfants et initialisez-les en fonction de données XML.

Exemple de mise en œuvre

Voici une implémentation améliorée de MyCalendar pour vos classes MyEvent et IXmlSerializable :

<code class="language-csharp">public class MyCalendar : IXmlSerializable
{
    //...

    public XmlSchema GetSchema() { return null; }

    public void ReadXml(XmlReader reader)
    {
        if (reader.MoveToContent() == XmlNodeType.Element)
        {
            // 读取属性
            _name = reader.GetAttribute("Name");
            _enabled = bool.Parse(reader.GetAttribute("Enabled"));
            _color = Color.FromArgb(int.Parse(reader.GetAttribute("Color")));

            // 读取子事件
            reader.ReadStartElement("MyEvents");
            while (reader.MoveToContent() == XmlNodeType.Element && reader.LocalName == "MyEvent")
            {
                MyEvent evt = new MyEvent();
                evt.ReadXml(reader);
                _events.Add(evt);
            }
            reader.ReadEndElement();
        }
    }

    public void WriteXml(XmlWriter writer)
    {
        // 写入属性
        writer.WriteAttributeString("Name", _name);
        writer.WriteAttributeString("Enabled", _enabled.ToString());
        writer.WriteAttributeString("Color", _color.ToArgb().ToString());

        // 写入子事件
        writer.WriteStartElement("MyEvents");
        foreach (MyEvent evt in _events)
        {
            evt.WriteXml(writer);
        }
        writer.WriteEndElement();
    }
}</code>
Copier après la connexion
<code class="language-csharp">public class MyEvent : IXmlSerializable
{
    //...

    public XmlSchema GetSchema() { return null; }

    public void ReadXml(XmlReader reader)
    {
        if (reader.MoveToContent() == XmlNodeType.Element)
        {
            // 读取属性
            _title = reader.GetAttribute("Title");
            _start = DateTime.FromBinary(long.Parse(reader.GetAttribute("Start")));
            _stop = DateTime.FromBinary(long.Parse(reader.GetAttribute("Stop")));
        }
    }

    public void WriteXml(XmlWriter writer)
    {
        // 写入属性
        writer.WriteAttributeString("Title", _title);
        writer.WriteAttributeString("Start", _start.ToBinary().ToString());
        writer.WriteAttributeString("Stop", _stop.ToBinary().ToString());
    }
}</code>
Copier après la connexion

En suivant ces directives, vous pouvez implémenter efficacement IXmlSerializable et contrôler la sérialisation et la désérialisation des types de données personnalisés. La méthode reader.GetAttribute() est utilisée dans l'exemple de code pour lire les valeurs des propriétés de manière plus sûre et éviter les exceptions potentielles.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal