2011-02-26 2 views
1

J'essaie de sérialiser un objet en mémoire, de le passer à un autre processus sous forme de chaîne et de le désérialiser.XmlSerializer Convertit les nouvelles lignes

J'ai découvert que le processus de sérialisation XML déconnecte les lignes de retour pour les chaînes dans l'objet.

byte[] b; 
// serialize to memory. 
using (MemoryStream ms = new MemoryStream()) 
{ 
    XmlSerializer xml = new XmlSerializer(this.GetType()); 
    xml.Serialize(ms, this); 
    b = ms.GetBuffer(); 
} 

// I can now send the bytes to my process. 
Process(b); 

// On the other end, I use: 
using (MemoryStream ms = new MemoryStream(b)) 
{ 
    XmlSerializer xml = new XmlSerializer(this.GetType()); 
    clone = (myObject)xml.Deserialize(ms); 
} 

Comment puis-je sérialiser un objet sans sérialisation sur disque comme ça, mais sans mutiler les sauts de ligne dans les cordes?

+0

Exactement quelles nouvelles lignes sont dépouillées? –

+0

Dans myObjcet, j'ai plusieurs chaînes, chacune pouvant contenir des nouvelles lignes. – Jerry

+0

Aussi, avez-vous le contrôle sur les classes en cours de sérialisation? Les deux processus exécutent-ils tous les deux .NET? Si oui, vous avez de meilleures options. –

Répondre

0

La réponse est venue d'un autre post de SO, mais je le republie ici parce que j'ai dû le modifier un peu.

Je devais créer une nouvelle classe pour gérer la lecture/écriture XML dans le flux mémoire. Ici, il est:

public class SafeXmlSerializer : XmlSerializer 
{ 
    public SafeXmlSerializer(Type type) : base(type) { } 

    public new void Serialize(StreamWriter stream, object o) 
    { 
     XmlWriterSettings ws = new XmlWriterSettings(); 
     ws.NewLineHandling = NewLineHandling.Entitize; 

     using (XmlWriter xmlWriter = XmlWriter.Create(stream, ws)) 
     { 
      base.Serialize(xmlWriter, o); 
     } 
    } 
} 

Comme il est construit au-dessus de XmlSerializer, il doit se comporter exactement comme prévu. C'est juste que quand je sérialiser avec un StreamWriter, j'utiliserai la version "sûre" de la sérialisation, me sauvant ainsi le mal de tête.

J'espère que cela aide quelqu'un d'autre.

0

Les chaînes doivent être encapsulées dans des sections CDATA pour préserver les retours à la ligne.

+0

Notez qu'il sérialise ses objets pour produire le XML - vous devez lui indiquer comment _put_ les chaînes dans les sections CDATA. –

Questions connexes