none
XML Serialise RRS feed

  • Question

  • Bonjour,

    Je souhaiterais sérialiser un objet en xml avec un encodage UTF-8.

    Or avec le code suivant:

    XmlSerializer xs = new XmlSerializer(typeof(Person));
                    using (StringWriter wr = new StringWriter())
                    {
                        xs.Serialize(wr, result);
                        
                        return wr.ToString();
                    }

    J'obtiens un encodage en utf-16

    Comment puis-je faire ? J'ai trouvé beaucoup de poste à ce sujet mais qui ne fonctionne pas pour une application Metro

    Merci de votre aide

    mardi 16 avril 2013 13:59

Réponses

  • Effectivement. Je ne garantis pas la performance, mais voici un bout de code fonctionnel pour obtenir le tableau de byte utf-8 :

     var xs = new XmlSerializer(typeof(Person));
     using (var memStream = new MemoryStream())
     {
         using (XmlWriter wr = XmlWriter.Create(memStream,
             new XmlWriterSettings()
             {
                 Encoding = Encoding.UTF8
             }))
         {
             xs.Serialize(wr, faqs.FAQItems[0]);
    
             var utf8 = memStream.ToArray();
    
         }
     }
    


    Jonathan ANTOINE - Découvrez mon livre sur MVVM: http://goo.gl/N6Tmn - http://www.jonathanantoine.com


    mardi 16 avril 2013 15:24
    Modérateur

Toutes les réponses

  • Hello,

    Est ce que ce code fonctionne : ?

     using (XmlWriter wr = XmlWriter.Create(stringBuilder,
                    new XmlWriterSettings()
                    {
                        Encoding = Encoding.UTF8
                    }))
                {
     
                    //CODE
                }


    Jonathan ANTOINE - Découvrez mon livre sur MVVM: http://goo.gl/N6Tmn - http://www.jonathanantoine.com

    mardi 16 avril 2013 14:26
    Modérateur
  • Je ne vois pas comment utiliser ce code... :/

    J'ai inséré mon code à la place de: //CODE mais cela ne change rien :/

    mardi 16 avril 2013 14:50
  • Quelque chose comme ceci : 

    XmlSerializer xs = new XmlSerializer(typeof(Person));
    var stringBuilder = new StringBuilder();
    using (XmlWriter wr = XmlWriter.Create(stringBuilder,
        new XmlWriterSettings()
        {
            Encoding = Encoding.UTF8
        }))
    {
        xs.Serialize(wr, result);
        return stringBuilder.ToString();
    
    }
    


    Jonathan ANTOINE - Découvrez mon livre sur MVVM: http://goo.gl/N6Tmn - http://www.jonathanantoine.com

    mardi 16 avril 2013 14:52
    Modérateur
  • Merci,

    Je viens de tester, mais le problème persiste, l'encodage est toujours UTF16

    mardi 16 avril 2013 14:55
  • Bonjour,


    Avez vous besoin des bytes correspondant à cette chaîne de caractère ? Si oui, il faut utiliser Encoding.UTF8.GetBytes();


    Jonathan ANTOINE - Découvrez mon livre sur MVVM: http://goo.gl/N6Tmn - http://www.jonathanantoine.com

    mardi 16 avril 2013 14:57
    Modérateur
  • Je souhaite récupérer ce flux xml dans une string
    mardi 16 avril 2013 15:01
  • Ce n'est pas possible "directement" car les strings sont encodées au format UTF-16 (cf. http://msdn.microsoft.com/en-us/library/ms404377.aspx). Vous ne pouvez manipuler qu'un tableau de bytes représentant la string au format UTF8.

    Quel est votre besoin initial ?

    Cordialement.

    Jonathan ANTOINE - Découvrez mon livre sur MVVM: http://goo.gl/N6Tmn - http://www.jonathanantoine.com

    mardi 16 avril 2013 15:04
    Modérateur
  • Je veux effectuer une requête http avec envoie de données XML

    j'ai donc utilisé ceci:

    HttpClient client = new HttpClient();
    HttpContent content = new StringContent(string.Format("<?xml version='1.0' encoding='UTF-8' standalone='yes'?><Person>Colaly</Person>"));
                

    Maintenant je souhaite remplacer cette chaine de caractère écrit en dur par la sérialisation d'un objet Person.

    Cela est-il possible ?

    mardi 16 avril 2013 15:08
  • Dans ce cas, vous pouvez utiliser un StreamContent ou un ByteArrayContent et écrire les bytes dedans :

    HttpClient client = newHttpClient(); HttpContent content = newByteArrayContent(Encoding.UTF8.GetBytes("ma string de test"));

    ou vous remplacerez "ma string de test" par la string obtenue avec le code précédent

      


    Jonathan ANTOINE - Découvrez mon livre sur MVVM: http://goo.gl/N6Tmn - http://www.jonathanantoine.com


    mardi 16 avril 2013 15:11
    Modérateur
  • Merci,

    Cependant, si je garde le même code pour sérialiser mon objet cela ne fonctionne pas ... j'ai toujours

    <?xml version='1.0' encoding='UTF-16'>

    :(

    mardi 16 avril 2013 15:18
  • Effectivement. Je ne garantis pas la performance, mais voici un bout de code fonctionnel pour obtenir le tableau de byte utf-8 :

     var xs = new XmlSerializer(typeof(Person));
     using (var memStream = new MemoryStream())
     {
         using (XmlWriter wr = XmlWriter.Create(memStream,
             new XmlWriterSettings()
             {
                 Encoding = Encoding.UTF8
             }))
         {
             xs.Serialize(wr, faqs.FAQItems[0]);
    
             var utf8 = memStream.ToArray();
    
         }
     }
    


    Jonathan ANTOINE - Découvrez mon livre sur MVVM: http://goo.gl/N6Tmn - http://www.jonathanantoine.com


    mardi 16 avril 2013 15:24
    Modérateur
  • Merci beaucoup pour votre aide et votre temps.

    Le problème est résolu, cela fonctionne. Encore merci

    mardi 16 avril 2013 15:39