2012-03-13 10 views
7

La forma más sencilla en que obtengo la deserialización de ServiceStack xml es cuando el xml contiene un espacio de nombres. Sin embargo, el xml que recibo no contiene espacios de nombres. El ejemplo de trabajo más simple:La deserialización de XML solo funciona con el espacio de nombres en xml

[Serializable] 
public class test 
{ 

} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string xml="<test xmlns=\"http://schemas.datacontract.org/2004/07/\"></test>"; 
     var result = ServiceStack.Text.XmlSerializer.DeserializeFromString<test>(xml); 
    } 
} 

Sin embargo, eso no es lo que quiero. Quiero que el siguiente para deserializar, ya que ese es el xml que recibo de varios servicios:

string xml="<test></test>"; 

Pero eso me da el siguiente error:

DeserializeDataContract: Error converting type: Error in line 1 position 7. 
Expecting element 'test' from namespace 
'http://schemas.datacontract.org/2004/07/'.. 
Encountered 'Element' with name 'test', namespace ''. 

Traté:

[Serializable] 
[XmlRoot("test", Namespace = "")] 
public class test 

No puedo crear un nuevo serializador porque ServiceStack.Text.XmlSerializer es estático. Necesito elegir ya sea Microsoft XmlSerializer O ServiceStack (no ambos). Significado: si no puedo hacer que funcione este sencillo ejemplo, debo omitir una parte del paquete ServiceStack que de otra manera sería muy útil. Lo último que quiero es inyectar un espacio de nombres ficticio en el xml entrante.

Respuesta

23

ServiceStack usos de .NET, XML DataContractSerializer para serializar XML para eliminar espacios de nombres que necesita para configurar el espacio de nombres ya sea en una cadena vacía con:

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

Pero entonces usted tendrá que marcar cada propiedad que desea serializado con Atributos de [DataMember] Una mejor opción es especificar un espacio de nombres vacío para todo tipo bajo un espacio de nombres de C# y añadiendo el atributo Asamblea en su archivo Assembly.cs, por ejemplo:

[assembly: ContractNamespace("", ClrNamespace = "MyServiceModel.DtoTypes")] 

Nota: se puede quitar el atributo [Serializable] - no es utilizado por ninguno de los serializadores de ServiceStack. Además, todos los atributos de XmlSerializer como [XmlRoot] son ​​inútiles ya que ServiceStack usa DataContractSerializer de .NET y no el anterior XmlSerializer de Microsoft.

+0

Gracias! ¡Ese era el eslabón perdido que necesitaba! De alguna manera no puedo encontrar la documentación correcta como esta para ServiceStack ... – user1154148

+0

¿Alguna razón por la que no escribió su propio deserializador XML? El Microsoft parece necesitar este tipo de configuración de salsa mágica para que funcione, a diferencia de su serializador/deserializador JSON, que simplemente funciona. – JasonD

+0

@JasonD Sí, no me gusta NIH'ing sin una buena razón y prefiero no usar XML. El XML DCS de MS también es bastante eficiente para XML, hay pocos beneficios por la cantidad de esfuerzo que habría requerido. – mythz

Cuestiones relacionadas