IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dotnet Discussion :

Serialisation avec CDATA => Cannot Serialize member


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Par défaut Serialisation avec CDATA => Cannot Serialize member
    Bonjour,

    J'ai un petit problème de sérialisation mais je bloque depuis 2j dessus :

    J'ai une classe Values qui à un code (XmlAttribute) et une value (XmlText).

    Et j'aimerais obtenir dans mon XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Values code=\"12390\"><![CDATA[Static]]></Values> => où <![CDATA[Static]] est ma value.
    au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <Values code=\"12390\"><value><![CDATA[Static]]></value></Values>  => Je ne veux pas les balises "value"
     
    ou
     
    <Values code=\"12390\">Static</value></Values>  => Il manque le CDATA

    Mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
        [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
        [System.SerializableAttribute()]
        [System.Diagnostics.DebuggerStepThroughAttribute()]
        [System.ComponentModel.DesignerCategoryAttribute("code")]
        [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
        public class Values
        {
            public Values()
            {}
     
            [System.Xml.Serialization.XmlAttributeAttribute()]
            public long code { get; set; }
     
            private CDATA _val;
            //[System.Xml.Serialization.XmlTextAttribute()]
            [XmlText(typeof(CDATA))]
            public CDATA value
            {
                get { return _val; }
                set { _val = value; }
            }
        }
    et ma classe CDATA (prise sur internet) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
         #region CDATA
        public class CDATA : IXmlSerializable
        {
     
            private string text;
     
            public CDATA()
            { }
     
            public CDATA(string text)
            {
                this.text = text;
            }
     
            public string Text
            {
                get { return text; }
            }
     
            XmlSchema IXmlSerializable.GetSchema()
            {
                return null;
            }
     
            void IXmlSerializable.ReadXml(XmlReader reader)
            {
                this.text = reader.ReadString();
                reader.Read();
            }
     
            void IXmlSerializable.WriteXml(XmlWriter writer)
            {
                writer.WriteCData(this.text);
            }
            public override string ToString()
            {
                return this.text;
            }
        }
        #endregion
    Lorsque je sérialize (BDD vers XML) j'obtiens :
    {"Cannot serialize member 'value' of type namespace.CDATA. XmlAttribute/XmlText cannot be used to encode types implementing IXmlSerializable."}

    Je sèche donc si quelqu'un à une idée !

    Merci beaucoup d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Par défaut
    Bonjour,
    J'ai trouvé enfin !!!

    Il suffit d’implémenter : XmlCharacterData sur Values
    et d'overrider deux méthodes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     public override void WriteContentTo(XmlWriter w)
            {
                w.WriteAttributeString("code", code.ToString());
                w.WriteCData(value);
            }
     
            public override void WriteTo(XmlWriter w)
            {
                w.WriteAttributeString("code", code.ToString());
                w.WriteCData(value);
            }
    Ensuite il faut avoir sur le constructeur de Values ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     public Values() : base("test", new XmlDocument()) 
            {
            }
    le tout en mettant XmlIgnore sur les propriétés comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     [XmlIgnore]
            public long code { get; set; }
     
            [XmlIgnore]
            public string value{ get; set; }
    Cela servira peut-être un jour à quelqu'un !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/05/2007, 11h07
  2. Réponses: 2
    Dernier message: 18/07/2006, 14h46
  3. XML vers HTML - pb avec CDATA
    Par barnamax dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 12/07/2006, 11h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo