2012-05-10 27 views
7

Estoy usando DataContractSerializer para serializar un objeto a XML usando el atributo DataMember (solo las propiedades públicas están serializadas).
¿Es posible ignorar dinámicamente algunas propiedades para que no se incluyan en la salida XML?

Por ejemplo, para permitir al usuario seleccionar los elementos xml deseados en algún control de lista y luego serializar solo los elementos seleccionados por el usuario excluyendo todos los que no están seleccionados.Ignorar algunas propiedades en tiempo de ejecución al usar DataContractSerializer

Gracias

Respuesta

3

Para el escenario de la lista, tal vez simplemente una propiedad diferente, así que en vez de:

[DataMember] 
public List<Whatever> Items {get {...}} 

que tienen: sin embargo

public List<Whatever> Items {get {...}} 

[DataMember] 
public List<Whatever> SelectedItems { 
    get { return Items.FindAll(x => x.IsSelected); } 

, deserializar que sería un dolor, ya que su lista necesitaría alimentar en artículos; si necesita deserializar también, es posible que deba escribir una lista personalizada compleja.


Como segunda idea; simplemente cree una segunda instancia del objeto con solo los artículos que desea serializar; muy simple y eficaz:

var dto = new YourType { X = orig.X, Y = orig.Y, ... }; 
foreach(var item in orig.Items) { 
    if(orig.Items.IsSelected) dto.Items.Add(item); 
} 
// now serialize `dto` 

yo sepa, DataContractSerializer no admite la serialización condicional de los miembros.

Al nivel propiedad individual, este es una opción si está utilizando XmlSerializer, sin embargo - para una propiedad, por ejemplo, Foo, que acaba de añadir:

public bool ShouldSerializeFoo() { 
    // return true to serialize, false to ignore 
} 

o:

[XmlIgnore] 
public bool FooSpecified { 
    get { /* return true to serialize, false to ignore */ } 
    set { /* is passed true if found in the content */ } 
} 

Se aplican únicamente como una convención basada en el nombre.

+0

Gracias, Marc. Entonces, por ejemplo, si tengo una instancia de List donde MyClass tiene tres propiedades X, Y y Z, sería posible incluir solo las propiedades X e Y e ignorar Z para cada elemento en la lista y luego enviar esta lista a DataContractSerializer y el serializador incluirá solo X e Y en la salida e ignorará Z? Solo quiero excluir algunas propiedades para cada elemento en la lista. ¿Es posible con algunas de las opciones que has especificado arriba? – Joxi

+1

En el caso de querer serializar 'X' y' Y' pero no 'Z'; con DCS que solo está disponible (hasta donde yo sé) si se aplica a ** todos ** los elementos, es decir, eligiendo '[DataMember]' o '[IgnoreDataMember]' apropiadamente; DCS no tiene serialización condicional según mi leal saber y entender. –

Cuestiones relacionadas