2017-05-09 1 views
1

Je lis ce file et j'utilise le System.Xml.Serialization.XmlSerializer pour sérialiser et désérialiser. Désolé, je ne parviens pas à publier le contenu du fichier dans cette question car StackOverflow ne les codage pas correctement.Chaînes de sérialisation et de désérialisation contenant des caractères hexadécimaux

La fonction Deserialize émet une exception. '', La valeur hexadécimale 0x03, est un caractère non valide. ''

Ligne 5, position 20.

Qu'est-ce que je fais de mal?

Voici mon code. Aussi disponible here

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Text; 
using System.Xml.Serialization; 

namespace XMLTester 
{ 
    public class HexTester 
    { 
     public static void Main(string[] args) 
     { 

      var lines = File.ReadAllLines(@"..\..\HexText.txt"); ; 

      var foo = new Foo() 
      { 
       Items = new List<FooBar>() 
       { 
        new FooBar() 
        {        
         Text = lines[0]       
        } 
       } 
      }; 

      string xml = SerializeToXML(foo); 
      var objTabs = DeserializeFromXML(xml, typeof(Foo)); //This throws an error 
     } 

     static string SerializeToXML(object obj) 
     { 
      StringBuilder xml = new StringBuilder(); 
      XmlSerializer serializer = new XmlSerializer(obj.GetType()); 
      TextWriter textWriter = new StringWriter(xml); 
      serializer.Serialize(textWriter, obj); 
      textWriter.Close(); 

      return xml.ToString(); 
     } 

     static object DeserializeFromXML(string xml, Type toType) 
     { 
      XmlSerializer deserializer = new XmlSerializer(toType); 
      TextReader textReader = new StringReader(xml); 

      Object obj = deserializer.Deserialize(textReader); //This throws an error 
      textReader.Close(); 

      return obj; 
     } 

    } 

    public class Foo 
    { 
     public List<FooBar> Items { get; set; } 
    } 
    public class FooBar 
    { 
     public string Text { get; set; } 
    } 
} 
+0

À quoi sert la sérialisation d'un fichier texte? –

+0

Je viens d'obtenir l'objet Foo passé à ma fonction. J'ai donné l'exemple à lire dans le fichier car StackOverflow ne me permettait pas de publier les caractères directement. –

+0

J'ai testé votre code. Je pense que le problème réside dans le ** fichier **. Si vous téléchargez le fichier directement, vous verrez des caractères invisibles. Si je copie le contenu de Google Drive alors le programme n'a pas d'exceptions. –

Répondre

1

0x03 (End-of-Text character) est tout simplement not an allowed character in XML.

Vous devrez donc clean the invalid characters avant de sérialiser ou de désérialiser.

+0

Pensez-vous que l'encodage des caractères différemment fonctionnera? –

+0

Je suis d'accord que 0x03 n'est pas un caractère autorisé en XML. Mais je cherche un moyen de sérialiser cela en un personnage valide. Avez-vous des commentaires à ce sujet? Puis-je encoder la chaîne différemment avant la sérialisation? –

+0

@CodingDawg: Pourquoi ne pas placer le texte xml sérialisé dans une section [CDATA] (https://en.wikipedia.org/wiki/CDATA) (_like _) avec [XmlDocument.CreateCDataSection] (https://msdn.microsoft.com/en-us/library/system.xml.xmldocument.createcdatasection.aspx). Jetez un oeil à [sérialiser une chaîne en tant que CDATA en utilisant XmlSerializer] (http://stackoverflow.com/a/1380050/7988857). – stomtech