2010-09-08 11 views
5

J'essaie de sérialiser/désérialiser le code de proxy de service Web WCF généré à partir de svcutil. Bien que je puisse sérialiser les objets, je ne suis pas capable de les désérialiser en objets. Voici le code XML je généré par sérialisation:Comment sérialiser/désérialiser le code proxy WCF généré?

<RootObject xmlns="http://schemas.myco.com/online/sync/2008/11"> 
    <WrapperObject> 
     <Objects> 
      <SomeObject p4:type="Foo" ContextId="d5f9f021-b2a1-47ba-9f25-1e068194dc87" ObjectId="fad3ef87-3944-459d-b45b-1e4e52ef24db" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.myco.com/online/sync/2008/11" /> 
     </Objects> 
     </WrapperObject> 
</RootObject> 

J'ai quelques questions:

  1. J'utilise déjà XmlSerializerNamespaces de déclarer l'espace de noms pour correspondre à l'espace de noms spécifié dans le code proxy généré. Comment se fait-il qu'il y ait encore une balise "p4" ajoutée à la balise "SomeObject" et un nouvel espace de noms xml ajouté (xmlns: p4 = "http://www.w3.org/2001/XMLSchema-instance").

    using (XmlWriter xmlWriter = XmlWriter.Create(stringBuilder, xmlSettings)) 
        { 
         XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); 
         namespaces.Add(string.Empty, defaultNamespace); 
    
         XmlSerializer serializer = new XmlSerializer(typeof(T), defaultNamespace); 
         serializer.Serialize(xmlWriter, objectToBeSerialized, namespaces); 
    
         return stringBuilder.ToString(); 
        } 
    
  2. Lorsque je tente de désérialiser le XML avec le code suivant, je reçois l'erreur suivante: « System.InvalidOperationException:. Une erreur est survenue la génération du document XML ---> System.Xml.XmlException: 'p4: type' est un nom d'attribut en double. "

    using (TextReader textReader = new StringReader(xmlString)) 
        { 
         using (XmlReader xmlReader = XmlReader.Create(textReader)) 
         { 
          XmlSerializer serializer = new XmlSerializer(typeof(T), defaultNamespace); 
          return (T)serializer.Deserialize(xmlReader); 
         } 
        } 
    
  3. Le code est généré par proxy svcutil pour communiquer avec un service Web WCF. Tous les objets générés sont sérialisés/désérialisés correctement lorsque j'utilise simplement l'appel de service Web.

Avez-vous déjà eu des problèmes similaires?

Répondre

4

WCF utilise des sérialiseurs XML spécialisés pour sérialiser les objets qui généreront XML différemment du XmlSerializer standard. Vous pouvez utiliser XmlSerializer, mais vous devrez attribuer correctement votre classe à l'objet objectToBeSerialized. Il est probablement préférable d'utiliser les sérialiseurs WCF à la place.

Jetez un oeil à cet article:

http://msdn.microsoft.com/en-us/magazine/cc163569.aspx