2011-12-21 8 views
5

¿Cómo serializo una lista sin el elemento externo usando el serializador de contrato de datos? Estoy usando .Net 3.5. Tengo una clase que contiene una lista, entre otras cosas, que deseo para serializar sin el elemento exterior para ser compatible con el XSD pertinente:Serializador de contrato de datos: cómo omitir el elemento externo de una colección

[DataContract(Name="MyClass")] 
public class MyClass 
{ 
... 
[DataMember(Name="Parameters")] 
public List<Parameter> Parameters; 
... 
} 

[DataContract(Name="Parameter")] 
public struct Parameter 
{ 
    [DataMember(Name="ValueName")]string ValueName; 
    [DataMember(Name="Value")]int Value; 
    public Parameter(string ValueName, int Value) 
    { 
     this.ValueName = ValueName; 
     this.Value = Value;    
    } 
} 

Lo anterior serializa como (suponiendo sólo un parámetro en la lista) :

<MyClass> 
    <Parameters> 
     <Parameter> 
      <ValueName></ValueName> 
      <Value></Value> 
     </Parameter> 
    </Parameters> 
</MyClass> 

me gustaría serializarlo de la siguiente manera:

<MyClass> 
     <Parameter> 
      <ValueName></ValueName> 
      <Value></Value> 
     </Parameter> 
</MyClass> 

Utilizando el XmlSerializer que puedo hacer esto mediante la aplicación de la [XmlElement] a la lista:

[XmlElement ("Parameter")] 
public List<Parameter> Parameters; 

Sin embargo no quiero utilizar el XmlSerializer porque mi clase tiene algunas propiedades que no están serialización amable y me estaba esperando para hacer frente a los que utilizan la familia [OnSerializing] de atributos.

Gracias.

+0

Usted no tiene mucho control sobre el formateo de mensajes con DataContracts. Es posible que deba usar MessageContract; consulte http://msdn.microsoft.com/en-us/library/ms730255.aspx – StuartLC

Respuesta

4

El serializador DataContract no permite este grado de control sobre el XML resultante, en su lugar deberá usar el XmlSerializer para lograr esto.

+0

. Bien, gracias. Cada vez que busco algo y no puedo encontrarlo, generalmente es porque no se puede hacer o es tan estúpido que nadie más pensó en hacerlo. Gracias por confirmar lo anterior ;-) – chrisj

+0

¿Cómo puedo usar XmlSerializer para controlar el resultado? – natenho

+0

@natenho vea la pregunta, el OP ya tiene una solución para eso en la parte inferior de la pregunta. –

0

Lo siguiente funciona usando MessageContracts aunque es un 'hack' - atribuye el elemento "MyClass" al miembro List y excluye el espacio de nombres del wrapper para "MyClass".

[ServiceContract(Namespace="")] 
public interface IService1 
{ 
    [OperationContract] 
    MyClass GetParameters(); 
    // TODO: Add your service operations here 
} 

[DataContract(Namespace="")] 
public class Parameter 
{ 
    [DataMember] 
    public string ValueName 
    { 
     get; 
     set; 
    } 
    [DataMember] 
    public int Value 
    { 
     get; 
     set; 
    } 

    public Parameter(string ValueName, int Value) 
    { 
     this.ValueName = ValueName; 
     this.Value = Value; 
    } 
} 

[MessageContract(IsWrapped = false, WrapperNamespace="")] 
public class MyClass 
{ 
    [MessageBodyMember(Name = "MyClass", Namespace = "")] 
    public List<Parameter> Parameters 
    { 
     get; 
     set; 
    } 
} 
3

Utilice un contrato de datos recogida:

[CollectionDataContract(Name = "MyClass", ItemName = "Parameter")] 
    public class ParameterList : List<Parameter> 
    { 

    } 
+0

No sé por qué alguien rechazó esto (quizás podrían dejar un comentario sobre el motivo. Me funcionó y está documentado aquí: https://msdn.microsoft.com/en-us/library/system.runtime.serialization. collectiondatacontractattribute (v = vs.90) .aspx –

+0

Supongo que fue downvoted porque aún dará como resultado un elemento externo con elementos secundarios que se repiten. La pregunta específicamente pide una forma de deshacerse del elemento externo. – Gruff

+0

La pregunta no pedía deshacerse del elemento externo (MyClass) para deshacerse del que está debajo (Parámetros) ... ¡que es exactamente lo que hace este atributo! –

Cuestiones relacionadas