2010-07-28 13 views
0

Résolu: le code ci-dessous ne provoque pas une boucle infinie comme je le pensais. la boucle était dans le code appelant la désérialisation. ce code affiché fonctionne très bienProblème xml-désérialisant l'objet imbriqué récursif

Je suis en train de sérialisation et la désérialisation XML l'objet suivant

public class MessageObjectCollection : List<MessageObject> 
{ 
    public string Serialize() 
    { 
     return XmlObjectSerializer.SerializeObject(this); 
    } 

    public static MessageObjectCollection DeSerialize(string serializedPriceHistory) 
    { 
     return XmlObjectSerializer.DeserializeObject<MessageObjectCollection>(serializedPriceHistory); 
    } 
} 

La classe MessageObject ressemble à ceci

public class MessageObject 
{ 
    public string Title; 
    public MessageObjectCollection Responses; 
} 

Donc, si j'ai une instance de messageobjectcollection qui ressemble à:

var msgColl = new MessageObjectCollection 
    { 
     new MessageObject 
       { 
        Title = "Hello", 
        Responses = new MessageObjectCollection 
         { 
          new MessageObject 
            { 
             Title = "hi", 
             Responses = null 
            } 
         } 
       } 
    } 

Je peux sérialiser cela très simplement en appelant var xml = msgColl.Serialize();

Cependant, lorsque j'essaie de désérialiser cela en appelant var msgColl = new MessageObjectCollection(). Deserialize (xml);

je reçois une exception de débordement de pile dans la méthode de désérialisation:

public static T DeserializeObject<T>(string xml) 
{ 
    T result; 
    var ser = new XmlSerializer(typeof(T)); 
    var buffer = StringToUTF8ByteArray(xml); 
    using (var stream = new MemoryStream(buffer, 0, buffer.Length)) 
    { 
     result = (T) ser.Deserialize(stream); 
    } 
    return result; 
} 

Quelqu'un sait ce que je fais mal?

Répondre

0

Je ne suis pas sûr si son rapport avec le problème, mais comme la méthode Désérialiser est statique ne devrait pas vous appellerez ...

var msgColl = MessageObjectCollection.Deserialize(xml); 

au lieu de ...

var msgColl = new MessageObjectCollection().Deserialize(xml); 

??

+0

Oui, votre droit bien sûr. Ce n'était pas le problème cependant. Ce code fonctionne très bien, la boucle infinie ne se passait pas dans ce code mais en amont dans le code appelant la désérialisation ... –

+0

Ok, content que vous l'ayez compris. – barrylloyd