2009-09-30 8 views
4

Existe-t-il un moyen pour XmlSerializer d'ignorer tous les membres par défaut, à moins que je dise le contraire?.NET XmlIgnore par défaut?

J'ai une classe de base et plusieurs classes dérivées avec beaucoup de membres, mais la plupart je ne veux pas être sérialisé. Seuls quelques-uns sont acceptés pour la sérialisation.

+1

Non. Il n'y a aucun moyen de le faire. Pourquoi utilisez-vous la sérialisation XML? Quelle version de .NET utilisez-vous? –

+0

.NET 3.5. J'utilise des fichiers XML pour décrire des cinématiques dans un jeu. J'aimerais que ces fichiers XML soient désérialisés en classes/objets correspondants afin que le moteur de jeu puisse exécuter la cinématique. Il y aura aussi une re-sérialisation dans l'éditeur de cutscene. S'il y a une meilleure façon de le faire que XML, je suis ouvert aux suggestions. XML + XMLSerializer permet de modifier et de déboguer facilement les cinématiques à la main, mais aussi de les implémenter et de les utiliser dans le code C#. – morrog

Répondre

4

Non, vous ne pouvez pas le faire. Le XmlSerializer utilise un processus de "désabonnement" - il sérialisera tout (toutes les propriétés publiques) à moins que vous n'ayez explicitement désactivé à l'aide de l'attribut [XmlIgnore]. Il n'y a aucun moyen de changer ce comportement.

Le .NET 3.5 DataContractSerializer prend l'autre approche - opt-in. Il ne sérialisera rien, à moins que vous le disiez spécifiquement, en décorant vos membres avec [DataMember].

Alors peut-être que le sérialiseur DataContract fonctionnerait pour vous? C'était un peu plus d'avantages (ne nécessite pas de constructeur sans paramètre, peut également sérialiser les propriétés internes et privées, et peut aussi sérialiser les champs au lieu de propriétés, si nécessaire), et il est réglé pour la vitesse. Il y a aussi des inconvénients - il ne supporte pas les attributs dans les nœuds XML - vous devrez donc choisir en fonction de vos besoins.

Il ya une bonne comparaison des deux par Dan Rigsby - vérifiez-le!

Marc

+0

Un facteur de création ou de rupture peut être le fait que DataContractSerializer ne prend pas en charge XmlAttributeAttribute. –

1

Vous pouvez implémenter IXMLSerializable et déterminer ce que vous voulez sérialiser. Here est un exemple de sérialisation d'objet. Check out this SO poster sur la bonne façon d'implémenter IXMLSerializable. Here est un exemple d'utilisation de IXMLSerializable pour certaines collections.

Il ressemblerait à quelque chose comme ceci:

using System; 
using System.Xml; 
using System.Xml.Schema; 
using System.Xml.Serialization; 

namespace ConsoleApplicationCSharp 
{ 
    public class ObjectToSerialize : IXmlSerializable 
    { 
    public string Value1; 
    public string Value2; 
    public string Value3; 
    public string ValueToSerialize; 
    public string Value4; 
    public string Value5; 

    public ObjectToSerialize() { } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteElementString("Val", ValueToSerialize); 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     if (reader.MoveToContent() == XmlNodeType.Element && reader.LocalName == "Event") 
     { 
      ValueToSerialize = reader["Val"]; 
      reader.Read(); 
     }   
    } 
    public XmlSchema GetSchema() { return (null); } 
    public static void Main(string[] args) 
    { 
     ObjectToSerialize t = new ObjectToSerialize(); 
     t. ValueToSerialize= "Hello"; 
     System.Xml.Serialization.XmlSerializer x = new XmlSerializer(typeof(ObjectToSerialize)); 
     x.Serialize(Console.Out, t); 
     return; 
    } 
    } 
} 
+0

I thnk writer.WriteFullEndElement(); n'est pas nécessaire dans votre code, puisque vous avez utilisé WriteElementString au lieu de WriteStartElement. – Anax

+0

Merci, je l'ai mis à jour. Je suppose que je devrais également noter que j'étais un peu paresseux, cette classe wouldnt xml sérialiser à n'importe quoi puisque je n'ai aucune propriété. Supposons que mes variables membres sont des propriétés :) – SwDevMan81

Questions connexes