2011-08-24 7 views
5

Aquí está el código tratando de compact framework para obtener el servicio http ..No se puede deserializar con resultado XMLSerializer de WCF servicio web

List<Table> tables; 
    using (Stream r = response.GetResponseStream()) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(Table),"http://schemas.datacontract.org/2004/07/"); 
     tables=(List<Table>) serializer.Deserialize(r); 
    } 

    response.Close(); 

falla con { "Hay un error en el documento XML (1, 2). "}

{"<ArrayOfTable xmlns='http://schemas.datacontract.org/2004/07/WpfApplication1.Data.Model'> was not expected."} 

Tabla espacio de nombres es la misma ... no sé cuál es incorrecto allí ...

ACTUALIZACIÓN

El problema fue que tenía typeof (Table) no typeof (List<Table>) que funciona parcialmente ... ¡No hay error, pero los valores de las tablas creadas son nulos!

+0

Creo que el segundo parámetro especifica el espacio de nombres predeterminado para la serialización, no para deserialización. –

Respuesta

5

El segundo parámetro en el constructor XmlSerializer funciona tanto para la serialización como para la deserialización. Por lo tanto, en el segundo parámetro (el espacio de nombres) debe ser el mismo que el que se está recibiendo. Por lo que al final tener:

XmlSerializer serializer = new XmlSerializer(typeof(Table),"http://schemas.datacontract.org/2004/07/WpfApplication1.Data.Model") 

Nota del "WpfApplication1.Data.Model" al final de la cadena de espacio de nombres.

Una forma de deshacerse del espacio de nombres. Es especificar en su clase del modelo (tabla) que no debe utilizar un espacio de nombres:

[DataContract(Namespace = "")] 
public class Table { ... } 

De esta manera no es necesario especificar el espacio de nombres para la deserialización.

Espero que ayude!

0

En lugar de devolver una lista devuelve un objeto que tiene una sola propiedad de lista.

4

No estoy seguro si esto ayudará, pero tuvimos un problema similar. En lugar de decorar miles de elementos de datos con los atributos DataContract/DataMember y usar el DataContractSerializer (predeterminado), descubrimos que si nuestro servicio WCF usara el XmlSerializerFormat, podríamos deserializar fácilmente nuestros objetos.

[System.ServiceModel.ServiceContract] 
public interface IRestService 
{ 
    [System.ServiceModel.OperationContract] 
    // Added this attribute to use XmlSerializer instead of DataContractSerializer 
    [System.ServiceModel.XmlSerializerFormat(
     Style=System.ServiceModel.OperationFormatStyle.Document)] 
    [System.ServiceModel.Web.WebGet(
     ResponseFormat = System.ServiceModel.Web.WebMessageFormat.Xml, 
     UriTemplate = "xml/objects/{myObjectIdentifier}")] 
    MyObject GetMyObject(int myObjectIdentifier); 
} 

Ésta es la forma en que estamos deserializar los objetos:

public static T DeserializeTypedObjectFromXmlString<T>(string input) 
{ 
    T result; 

    try 
    { 
     System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(T)); 
     using (System.IO.TextReader textReader = new System.IO.StringReader(input)) 
     { 
      result = (T)xs.Deserialize(textReader); 
     } 
    } 
    catch 
    { 
     throw; 
    } 

    return result; 
} 
Cuestiones relacionadas