none
An XML declaration is required for all non-UTF8 documents RRS feed

  • Question

  • An XML declaration is required for all non-UTF8 documents.
     
    Bonjour,
    Je voudrai résoudre cette exception.
     
    J’ai une classe toute simple.
    namespace Serialiser
    {
        [DataContract]
        public class Personne
        {
            [DataMember]
            public string Nom { get; set; }
            [DataMember]
            public string Prenom { get; set; }
        }
    }

    Je veux la sérialiser et la désérialiser.

    public string Serialize<T>(T data)
    {
        using (var memoryStream = new MemoryStream())
        {
            var serializer = new DataContractSerializer(typeof(T));
            serializer.WriteObject(memoryStream, data);
    
            memoryStream.Seek(0, SeekOrigin.Begin);
    
            var reader = new StreamReader(memoryStream);
            var content = reader.ReadToEnd();
    
            return content;
        }
    }
    
    public T Deserialize<T>(string xml)
    {
        using (var stream = new MemoryStream(Encoding.Unicode.GetBytes(xml)))
        {
            var serializer = new DataContractSerializer(typeof(T));
            var theObject = (T)serializer.ReadObject(stream);
    
            return theObject;
        }
    }

    Pour tester je crée un premier objet je le sérialise et je le désérialise pour
    en créer une deuxième.

    private void Button_Click_2(object sender, RoutedEventArgs e)
    { 
        Personne p1 = new Personne() { Nom = "Martin", Prenom = "Jean" };
        string s = null;
        s = Serialize<Personne>(p1);
        Personne p2 = Deserialize<Personne>(s);     
    }

    La sérialisation semble fonctionner et renvoie un string.

    <Personne xmlns=\"http://schemas.datacontract.org/2004/07/Serialiser\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><Nom>Martin</Nom><Prenom>Jean</Prenom></Personne>
    Mais quand je désérialiser j’ai l’exception suivante.
     
    Une exception de type 'System.Xml.XmlException' s'est produite dans
    System.Runtime.Serialization.dll mais n'a pas été gérée dans le code
    utilisateur
     
    Informations supplémentaires : An XML declaration is required for all
    non-UTF8 documents.
     

    S'il existe un gestionnaire pour cette exception, le programme peut
    continuer en toute sécurité.

    Merci.


    dimanche 3 février 2013 13:53

Réponses

  • Je crois que j'ai trouvé:

    En utilisant un XmlSerializer au lieu d'un DataContractSerializer ça fonctionne.

            public string Serialize<T>(T data)
            {
                using (var memoryStream = new MemoryStream())
                {
                    // L'utilisation du XMLSerialiser ajoute <?xml version="1.0"?> au début de la chaîne
                    var serializer = new XmlSerializer(typeof(T));
                    serializer.Serialize(memoryStream, data);                
                    
                    // var serializer = new DataContractSerializer(typeof(T));
                    // serializer.WriteObject(memoryStream, data);
    
                    memoryStream.Seek(0, SeekOrigin.Begin);
    
                    var reader = new StreamReader(memoryStream);
                    var content = reader.ReadToEnd();
    
                    return content;
                }
            }
    
            public T Deserialize<T>(string xml)
            {
                using (var stream = new MemoryStream(Encoding.Unicode.GetBytes(xml)))
                {
                    // var serializer = new DataContractSerializer(typeof(T));
                    // var theObject = (T)serializer.ReadObject(stream);
    
                    var serializer = new XmlSerializer(typeof(T));
                    var theObject = (T)serializer.Deserialize(stream);
    
                    return theObject;
                }
            }

    dimanche 3 février 2013 15:01

Toutes les réponses

  • public T Deserialize<T>(string xml)
    {
    	using (var stream = new MemoryStream(Encoding.Unicode.GetBytes(xml)))
    	using (var writer = new StreamWriter(stream) { AutoFlush = true })
    	{
    		writer.Write(xml);
    		stream.Flush();
    		stream.Position = 0;
    		var serializer = new DataContractSerializer(typeof(T));
    		var theObject = (T)serializer.ReadObject(stream);
    		return theObject;
    	}
    }

    dimanche 3 février 2013 14:33
  • A non désolé ça ne marche pas beaucoup mieux...

    Une exception de type 'System.Runtime.Serialization.SerializationException' s'est produite dans System.Runtime.Serialization.dll mais n'a pas été gérée dans le code utilisateur

    Informations supplémentaires : There was an error deserializing the object of type Serialiser.Personne. The data at the root level is invalid. Line 1, position 1.

    dimanche 3 février 2013 14:58
  • Je crois que j'ai trouvé:

    En utilisant un XmlSerializer au lieu d'un DataContractSerializer ça fonctionne.

            public string Serialize<T>(T data)
            {
                using (var memoryStream = new MemoryStream())
                {
                    // L'utilisation du XMLSerialiser ajoute <?xml version="1.0"?> au début de la chaîne
                    var serializer = new XmlSerializer(typeof(T));
                    serializer.Serialize(memoryStream, data);                
                    
                    // var serializer = new DataContractSerializer(typeof(T));
                    // serializer.WriteObject(memoryStream, data);
    
                    memoryStream.Seek(0, SeekOrigin.Begin);
    
                    var reader = new StreamReader(memoryStream);
                    var content = reader.ReadToEnd();
    
                    return content;
                }
            }
    
            public T Deserialize<T>(string xml)
            {
                using (var stream = new MemoryStream(Encoding.Unicode.GetBytes(xml)))
                {
                    // var serializer = new DataContractSerializer(typeof(T));
                    // var theObject = (T)serializer.ReadObject(stream);
    
                    var serializer = new XmlSerializer(typeof(T));
                    var theObject = (T)serializer.Deserialize(stream);
    
                    return theObject;
                }
            }

    dimanche 3 février 2013 15:01
  • Bonjour,
    Je souhaiterais savoir si le script présenté au-dessus permet d'encoder un résultat XML au format UTF-8 ?
    Si oui, existe-il un code VBS qui permettra à chaque fois d'encoder un résultat XML (balises et noeuds) au format UTF-8 ? Cordialement

    jeudi 29 août 2013 08:04