64 votes

Utilisation de DataContractSerializer pour la sérialisation, mais impossible pour la désérialiser

J'ai les 2 fonctions:

public static string Serialize(object obj)
{
    DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
    MemoryStream memoryStream = new MemoryStream();
    serializer.WriteObject(memoryStream, obj);
    return Encoding.UTF8.GetString(memoryStream.GetBuffer());
}

public static object Deserialize(string xml, Type toType)
{
    MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
   // memoryStream.Position = 0L;
    XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(memoryStream, Encoding.UTF8, new XmlDictionaryReaderQuotas(), null);
    DataContractSerializer dataContractSerializer = new DataContractSerializer(toType);
    return dataContractSerializer.ReadObject(reader);
}

La première semble sérialiser un objet en chaîne de caractères xml bien. Le XML semble valide, pas cassé tags, pas de blanc espace au début ou à la fin, etc. Maintenant, la deuxième fonction ne veut pas désérialiser ma chaîne xml à l'objet. Sur la dernière ligne j'obtiens:

Il y avait une erreur de la désérialisation du l'objet de type [MON TYPE d'OBJET ICI]. Les données au niveau de la racine n'est pas valide. Ligne 1, position 1.

Ce que je fais mal? J'ai essayé de réécrire les Désérialiser fonction à quelques reprises, et il semble être toujours le même type d'erreur. Merci!!!!

Oh, et c'est de cette façon que je vais appeler la 2 fonctions:

SomeObject so = new SomeObject();
string temp = SerializationManager.Serialize(so);
so = (SomeObject)SerializationManager.Deserialize(temp, typeof(SomeObject));

139voto

Ray Vernagus Points 4276

Voici comment je l'ai toujours fait:

     public static string Serialize(object obj) {
        using(MemoryStream memoryStream = new MemoryStream())
        using(StreamReader reader = new StreamReader(memoryStream)) {
            DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
            serializer.WriteObject(memoryStream, obj);
            memoryStream.Position = 0;
            return reader.ReadToEnd();
        }
    }

    public static object Deserialize(string xml, Type toType) {
        using(Stream stream = new MemoryStream()) {
            byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
            stream.Write(data, 0, data.Length);
            stream.Position = 0;
            DataContractSerializer deserializer = new DataContractSerializer(toType);
            return deserializer.ReadObject(stream);
        }
    }
 

37voto

rudolf_franek Points 830

Une autre solution est:

 public static T Deserialize<T>(string rawXml)
{
    using (XmlReader reader = XmlReader.Create(new StringReader(rawXml)))
    {
        DataContractSerializer formatter0 = 
            new DataContractSerializer(typeof(T));
        return (T)formatter0.ReadObject(reader);
    }
}
 

Une remarque: il arrive parfois que le xml brut contienne par exemple:

<?xml version="1.0" encoding="utf-16"?>

Bien entendu, vous ne pouvez pas utiliser le codage UTF8 utilisé dans d'autres exemples.

33voto

Dimskiy Points 1524

J'ai fini par faire ce qui suit et ça marche.

 public static string Serialize(object obj)
{
    using (MemoryStream memoryStream = new MemoryStream())
    {
        DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
        serializer.WriteObject(memoryStream, obj);
        return Encoding.UTF8.GetString(memoryStream.ToArray());
    }
}

public static object Deserialize(string xml, Type toType)
{
    using (MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
    {
        XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(memoryStream, Encoding.UTF8, new XmlDictionaryReaderQuotas(), null);
        DataContractSerializer serializer = new DataContractSerializer(toType);
        return serializer.ReadObject(reader);
    }
}
 

Il semble que le problème majeur soit dans la fonction Serialize lors de l'appel de stream.GetBuffer (). L'appel de stream.ToArray () semble fonctionner.

-3voto

Doron Massa Points 1

Ce meilleur pour XML Deserialize

  public static object Deserialize(string xml, Type toType)
    {

        using (MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
        {
            System.IO.StreamReader str = new System.IO.StreamReader(memoryStream);
            System.Xml.Serialization.XmlSerializer xSerializer = new System.Xml.Serialization.XmlSerializer(toType);
            return xSerializer.Deserialize(str);
        }

    }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X