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 :
Méthode WriteXml
Dans la méthode WriteXml
, les données sérialisées sont écrites dans le document XML. Voici quelques lignes directrices :
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 :
WriteXml
, écrivez la représentation XML de chaque objet enfant. 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>
<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>
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!