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

C# Discussion :

Convertir un type string vers MemoryStream et ensuite Serialize vers objet


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 17
    Points
    17
    Par défaut Convertir un type string vers MemoryStream et ensuite Serialize vers objet
    Bonjour,

    Après 3 heures de recherches, je demande la pitié....

    j'utilise le service gratuit : http://www.webservicex.net/globalweather.asmx

    Le résultat est le suivant (type string) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="utf-16"?>
    <CurrentWeather>
      <Location>Quebec, Que, Canada (CYQB) 46-48N 071-23W 74M</Location>
      <Time>Jun 17, 2008 - 12:00 PM EDT / 2008.06.17 1600 UTC</Time>
      <Wind> from the E (090 degrees) at 12 MPH (10 KT):0</Wind>
      <Visibility> 15 mile(s):0</Visibility>
      <SkyConditions> mostly cloudy</SkyConditions>
      <Temperature> 64 F (18 C)</Temperature>
      <DewPoint> 59 F (15 C)</DewPoint>
      <RelativeHumidity> 82%</RelativeHumidity>
      <Pressure> 29.65 in. Hg (1004 hPa)</Pressure>
      <Status>Success</Status>
    </CurrentWeather>

    Je désire Sérializer le xml dans l'object suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        public class CurrentWeather
        {        
            public string Location;
            public string Time;
            public string Wind;
            public string Visibility;
            public string SkyConditions;
            public string Temperature;
            public string Status;
            public string Pressure;
            public string DewPoint;
            public string RelativeHumidity;
        }


    Voici mon code de la sérialization :

    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
     
            private void button1_Click(object sender, EventArgs e)
            {
                Weather.GlobalWeatherSoapClient serv = new WindowsFormsApplication1.Weather.GlobalWeatherSoapClient();
                string txtXml = serv.GetWeather("Quebec", "Canada");
                txtXml = txtXml.Replace("\n", Environment.NewLine);
     
                Byte[] bytes = System.Text.Encoding.ASCII.GetBytes(txtXml);
                MemoryStream ms = new MemoryStream(bytes);
     
                XmlSerializer serialiseur = new XmlSerializer(typeof(CurrentWeather));
     
                CurrentWeather myclass;
     
                // Erreur obtenu : Il existe une erreur dans le document XML (0, 0).
                myclass = (CurrentWeather)serialiseur.Deserialize((Stream) ms);
                ms.Close();
            }

    Si j'enregistre le contenu XML dans un fichier avec un StreamWrite et que je charge à partir d'un StreadReader c'est ok. Mais directement par la mémoire par StreamMemory, cela échoue.

    Il y a donc, une mauvais utilisation de ma part du MemoryStream.
    Quelqu'un sait comment dépanner ce problème?

    s.v.p. et merci pour votre attention.

    Jimmy le débutant.

    (si vous lisez bien la météo de Québec, c'est la grande averse de pluie).

  2. #2
    Membre expérimenté Avatar de Tober
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 824
    Points : 1 381
    Points
    1 381
    Par défaut
    Je fais ca dans mon projet (a peu pres) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Reference r = new Reference();
    System.IO.StreamReader s = new System.IO.StreamReader(urlReference);
    if (!s.EndOfStream)
    {
          XmlTextReader reader = new XmlTextReader(s);
          reader.Read();
          reader.Read();
          if (reader.Name == "Reference")
          {
                 r.ReadXml(reader);
          }
          s.Close();
    }
    ma classe Reference implemente IXmlSerializable donc r.ReadXml(reader) rempli ma variable grace au contenu du fichier XML,
    Tu peux faire pratiquement la meme chose, mais en creant ton XmlTextReader avec ton string txtXml directement !

  3. #3
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Il suffit d'utiliser StringReader et la version qui va avec de Deserialize() :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            private void button1_Click(object sender, EventArgs e)
            {
                Weather.GlobalWeatherSoapClient serv = new WindowsFormsApplication1.Weather.GlobalWeatherSoapClient();
                string txtXml = serv.GetWeather("Quebec", "Canada");
                //Inutile: txtXml = txtXml.Replace("\n", Environment.NewLine);
     
                //Inutile: Byte[] bytes = System.Text.Encoding.ASCII.GetBytes(txtXml);
                //Inutile: MemoryStream ms = new MemoryStream(bytes);
                StringReader sr = new StringReader(txtXml);
                XmlSerializer serialiseur = new XmlSerializer(typeof(CurrentWeather));
                CurrentWeather myclass = (CurrentWeather)serialiseur.Deserialize(sr);
                sr.Close();
            }

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 17
    Points
    17
    Par défaut
    La solution de neilbgr fonctionne

    merci beaucoup à vous deux.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 17
    Points
    17
    Par défaut
    J'ai tenté la même méthodologie sur un dataset mais sans succès.

    Auriez-vous une suggestion pour diminuer le nombre de conversions à cette fonction qui marche bien soit dit en passant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        public DataSet getDataSet(string txtXml)
            {
                //Convert XML text to Stream
                Byte[] bytes = System.Text.Encoding.ASCII.GetBytes(txtXml);
                MemoryStream oMemStm = new MemoryStream(bytes);
     
                DataSet ds = new DataSet();
                ds.ReadXml(oMemStm);
     
                return ds;
            }

  6. #6
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    En faisant ceci, ça devrait fonctionner (si le xml est formé de tel sorte que la classe DataSet puisse le comprendre...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // ...
                StringReader sr = new StringReader(txtXml);
                DataSet ds = new DataSet();
                ds.ReadXml(sr);
                sr.Close();
    // ...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 17
    Points
    17
    Par défaut
    oui merci, cela fonctionne je viens fouiller et j'ai constaté que StringReader dérive de TextReader. J'essayais directement avec un TextReader.

    Dernière question,

    Imaginons un serveur qui effectue des milliers d'opérations sans rien libérer, j'imagine que le ramasse-miette n'est pas en process prioritaire, donc, je risque de gongler inutilement la mémoire avant que le garbage-collector effectue son travaille de concierge.

    Donc, mes questions sont les suivantes :

    a) est-ce plus efficace d'utiliser .Dispose() pour libérer la mémoire ou le ramasse miette est sufisament efficace pour le faire lui-même.

    b) est-ce risqué de se fier uniquement sur le garbage collector?


    Jimmy

  8. #8
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    La lecture de cette article pourrait t'éclairer sur le sujet :
    http://merlin.developpez.com/cours/d...WeakReference/

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 17
    Points
    17
    Par défaut
    merci

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

Discussions similaires

  1. convertir un type string vers un type double
    Par hegros dans le forum C#
    Réponses: 2
    Dernier message: 16/06/2010, 10h11
  2. Convertir du type String a String[]
    Par Midou_vb dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 18/02/2010, 12h31
  3. Comment convertir un type string en byte ?
    Par savoir dans le forum Langage
    Réponses: 6
    Dernier message: 18/11/2008, 14h55
  4. convertir du type string au type double
    Par nafroutabs dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 15/09/2008, 11h27
  5. Convertir un type String en Integer VB-A
    Par sebeni dans le forum Général VBA
    Réponses: 1
    Dernier message: 09/05/2007, 17h18

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