2010-09-08 16 views
5

Sto provando a serializzare/deserializzare il codice proxy del servizio Web WCF generato da svcutil. Mentre sono in grado di serializzare gli oggetti, non riesco a deserializzarli di nuovo agli oggetti. Ecco il codice XML ho generato attraverso la serializzazione:Come serializzare/deserializzare il codice proxy WCF generato?

<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> 

Ho un paio di domande:

  1. Sono già usando XmlSerializerNamespaces di dichiarare lo spazio dei nomi in modo che corrisponda allo spazio dei nomi specificato nel codice proxy generato. Come mai c'è ancora un tag "p4" che ha aggiunto al tag "SomeObject" e un nuovo spazio dei nomi xml aggiunto (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. Quando provo a deserializzare il XML con il seguente codice, ottengo il seguente errore: "System.InvalidOperationException:. Si è verificato un errore durante la generazione del documento XML ---> System.Xml.XmlException: 'p4: tipo' è un nome di attributo duplicato. "

    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. Il codice proxy è generato da svcutil per comunicare con un servizio Web WCF. Tutti gli oggetti generati vengono serializzati/deserializzati correttamente quando uso solo la chiamata al servizio web.

Qualcuno ha avuto problemi simili prima?

risposta

4

WCF utilizza serializzatori XML specializzati per serializzare oggetti che generano XML in modo diverso dallo standard XmlSerializer. È possibile utilizzare XmlSerializer, ma è necessario attribuire correttamente la classe all'oggetto objectToBeSerialized. Probabilmente è meglio usare solo i serializzatori WCF.

Date un'occhiata a questo articolo:

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

Problemi correlati