2010-10-26 4 views
0

.net, C#Capture XML sérialisé lorsque deserialising

est facilement possible (par l'utilisation d'attributs, etc.) pour enregistrer automatiquement la chaîne XML entier (comme un champ de chaîne) qui a été créé lorsqu'un objet est sérialisé lorsque cela l'objet est désérialisé?

Je demande parce que je reçois un bouchon XML d'un service web, et ce stub contient une signature numérique que je peux utiliser pour vérifier le XML. Je peux désérialiser le XML en un objet utile qui peut être transmis à ma couche application pour vérification, mais j'ai aussi besoin du XML. Idéalement, mon nouvel objet aurait une propriété OriginalXML ou quelque chose. Je pourrais vérifier le XML à un niveau supérieur, mais ce n'est pas si pratique pour moi.

Cheers,

Chris.

Répondre

0

Vous pouvez charger le fichier XML dans une chaîne, pas de problème. Mais la propriété OriginalXML doit être marquée avec l'attribut [NonSerialized], car vous ne souhaitez pas stocker cette chaîne lors de la sérialisation. Vous devrez désérialiser, recharger en XmlDocument et stocker la chaîne résultante dans cette propriété.

XmlDocument xmlDoc = new XmlDocument(); 
try { 
    xmlDoc.Load(serializedFile); 
} 
catch (XmlException exc) { 
    // Handle the error 
} 

StringWriter stringWriter = new StringWriter(); 
XmlTextWriter xmlWriter= new XmlTextWriter(stringWriter); 
xmlDoc.WriteTo(xmlWriter); 

myObject.OriginalXML = xmlWriter.ToString(); 

HTH,
James

+0

Salut James, merci pour votre réponse. C'est vraiment bizarre, parce que je viens d'écrire exactement le même code que vous. Je suppose que j'espérais ne pas avoir à générer de désérialisation personnalisée, car nous avons des routines de sérialisation/désérialisation assez bien encapsulées, mais ce n'est pas un problème majeur. Merci encore! –

+0

Eh bien, si on a tous les deux trouvé ça, ça doit être la bonne réponse! N'hésitez pas à le marquer comme tel;) –

+0

En outre, la désérialisation personnalisée ne devrait pas être nécessaire ... il suffit d'ajouter l'attribut '[NonSerialized]' au champ OriginalXML pour vous éviter les problèmes de sérialisation. –

0

Que diriez-vous

[DataContract] 
class FooBar 
{ 
    //this property doesn't have the DataMember attribure 
    //and thus won't be serialized 
    public string OriginalXml { get; set; } 

    [DataMember] private int _foo; 
    [DataMember] private string _bar; 

    static public FooBar Deserialize(XmlReader reader) 
    { 
     var fooBar = 
      (FooBar)new DataContractSerializer(typeof(FooBar)).ReadObject(reader); 
     fooBar.OriginalXml = reader.ToString(); 
     return fooBar; 
    }   
} 
Questions connexes