2010-11-30 6 views
5

Tengo un tipo de colección personalizada muy simple que hereda de la Lista <> y utiliza un CollectionDataContract.¿WCF y DataContractSerializer serializan de forma diferente los tipos de colección CollectionDataContract?

Cuando uso DataContractSerializer.WriteObject para serializarlo, respeta el atributo CollectionDataContract de la forma que esperaba; sin embargo, cuando lo uso como un tipo de devolución para un método WCF, obtengo el ArrayOfFoo predeterminado.

Me pregunto si hay alguna decoración que me falta en el contrato de servicio.

Detalles:

[DataContract(Namespace = "")] 
public class Foo 
{ 
    [DataMember] 
    public string BarString { get; set; } 
} 

[CollectionDataContract(Namespace = "")] 
[Serializable] 
public class FooList : List<Foo> {} 

Si tan sólo una instancia de un Foo y luego usar DataContractSerializer.WriteObject a serializarlo, me sale lo que se espera:

<FooList> 
    <Foo> 
     <BarString>myString1</BarString> 
    </Foo> 
</FooList> 

Sin embargo, si tengo una servicio con un método como este ...

[ServiceContract Name = "MyService"] 
public interface IMyService 
{ 
    [OperationContract, WebGet(UriTemplate = "foos/")] 
    FooList GetAllFoos(); 
} 

y luego hacer un GET para http://www.someEndpoint.com/foos/, me sale esto:

<ArrayOfFoo> 
    <Foo> 
     <BarString>myString1</BarString> 
    </Foo> 
</ArrayOfFoo> 

También he intentado especificando Name = "MyFooListName" en el atributo CollectionDataContract. Los mismos resultados: DataContractSerializer obtiene la nota; WCF no.

+0

Creo que sí, convierte listas en matriz. –

+0

Tiene razón en que una lista se serializa en una matriz si no personaliza el tipo de colección; Lo que estoy tratando de averiguar es si hay una manera de lograr que WCF respete mi CollectionDataContract. – pisomojado

Respuesta

3

Saeed me envió en la dirección correcta: Inadvertidamente terminé con XmlSerializer, cuando esperaba DataContractSerializer.

Terminé con XmlSerializer ... bueno ... solicitándolo. métodos

En particular, había decoradas en mi servicio con el XmlSerializerFormat como esto:

[ServiceContract Name = "MyService"] 
public interface IMyService 
{ 
    // ... other stuff ... 

    [OperationContract, WebInvoke(UriTemplate = "foos/", Method = "POST")] 
    [XmlSerializerFormat] 
    Foo PostAFoo(Foo yourNewFoo); 
} 

que había hecho esto con la esperanza de que perdona la orden miembro de manchas en XML Foo enrollados a mano.Por supuesto, cuando uno hace esto uno termina con XmlSerializer, no con DataContractSerializer.

Cuando elimino el atributo XmlSerializerFormat, problema resuelto: WCF ahora está serializando mi colección FooList de la manera que quiero.

+0

No he probado el código anterior, pero funciona bien para la recopilación? –

2

Ver MSDN para el detalle:

DataContractSerializer no se apoyo al modelo de programación utilizado por la Web XmlSerializer y ASP.NET servicios. En particular, no admite atributos de compatibilidad como XmlElementAttribute y XmlAttributeAttribute. Para habilitar el soporte para este modelo de programación, WCF debe cambiarse para usar el XmlSerializer en lugar del DataContractSerializer.

Así que la serialización va a ser hecha por XMLSerializer, y no puede cambiarla.

0

¿Ha seleccionado Tipos genéricos al configurar su servicio WCF? si no, entonces,

haga clic derecho y vaya a la configuración, luego seleccione Tipo genérico, de forma predeterminada es el tipo de arrays.

Cuestiones relacionadas