2010-07-29 11 views
5

Tengo un DataContract como esto¿Puedo evitar que un datamember específico se deserialice?

[DataContract] 
class MyDC 
{ 
    [DataMember] 
    public string DM1; 

    [DataMember] 
    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

y veces Quiero prevenir la DM2 de ser deserializado al ser de regresar de una OperationContract. Algo como esto:

[OperationContact] 
public MyDC GetMyDC() 
{ 
    MyDC mdc = new MyDC(); 

    if (condition) 
    { 
     // Code to prevent DM2 from being deserialized 
    } 

    return mdc; 
} 

que siempre podría hacer una nueva DataContract que sólo tiene DM1 y DM3 y generar que a partir de la instancia MyDC pero quiero ver si es posible eliminar mediante programación DM2. ¿Es posible? ¿Cómo?

Respuesta

2
[DataContract] 
class MyDC 
{ 
    [DataMember] 
    public string DM1; 

    public string DM2; 

    public bool IsDM2Serializable; 

    [DataMember(Name="DM2", EmitDefaultValue = false)] 
    public string DM2SerializedConditionally 
    { 
     get 
     { 
      if(IsDM2Serializable) 
       return null; 
      return DM2; 
     } 
     set { DM2=value; } 
    } 

    [DataMember] 
    public string DM3; 
} 

A continuación, establezca IsDM2Serializable en false cuando se necesita para ocultarlo:

[OperationContact] 
public MyDC GetMyDC() 
{ 
    MyDC mdc = new MyDC(); 

    if (condition) 
    { 
     // Code to prevent DM2 from being serialized 
     mdc.IsDM2Serializable = false; 
    } 

    return mdc; 
} 
3

Lo que quiere decir es serialización y no deserialización.

Si se prepara una clase para la serialización de aplicar el atributo [DataContract] a la clase, sólo los miembros de la clase que tiene [DataMember] atributo será serializado:

[DataContract] 
class MyDC 
{ 
    [DataMember] 
    public string DM1; 

    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

En algunos casos más complejos el uso de [IgnoreDataMember] puede resuelve tu problema (Ver http://msdn.microsoft.com/en-us/library/ms733127.aspx)

Por cierto, puede serializar campos y propiedades, independientemente de la accesibilidad: private, protected, internal, protected internal o public. Puede serializar cualquier propiedad de lectura/escritura y no solo campos. Acerca de la serialización de los tipos de colección, vea http://msdn.microsoft.com/en-us/library/aa347850.aspx.

6

Una forma de hacerlo es establecer la propiedad EmitDefaultValue del DataMemberAttribute false:

[DataContract] 
class MyDC 
{ 
    [DataMember] 
    public string DM1; 

    [DataMember(EmitDefaultValue = false)] 
    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

Luego establecer esta propiedad en null:

[OperationContact] 
public MyDC GetMyDC() 
{ 
    MyDC mdc = new MyDC(); 

    if (condition) 
    { 
     // Code to prevent DM2 from being deserialized 
     mdc.DM2 = null; 
    } 

    return mdc; 
} 

esta manera, que la propiedad no lo hace escribir en la secuencia de salida en la serialización.

http://msdn.microsoft.com/en-us/library/aa347792.aspx

+0

Eso funciona si estoy creando una copia del objeto real que quiero serializar, y don' No importa cambiar la copia. Sin embargo, me gustaría hacerlo sin cambiar el objeto que intento serializar. – floatingfrisbee

Cuestiones relacionadas