2010-07-29 4 views
5

Ho un DataContract come questoÈ possibile impedire che uno specifico datamember venga deserializzato?

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

    [DataMember] 
    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

e volte voglio evitare che DM2 venga deserializzati quando viene tornato da un OperationContract. Qualcosa di simile a questo:

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

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

    return mdc; 
} 

potrei sempre fare un nuovo DataContract che ha solo DM1 e DM3 e generare che dall'istanza MyDC ma voglio vedere se è possibile rimuovere programatically DM2. È possibile? Come?

risposta

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; 
} 

Quindi impostare IsDM2Serializable su false quando è necessario nasconderlo:

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

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

    return mdc; 
} 
3

Quello che intendi è la serializzazione e non la deserializzazione.

Se si prepara una classe per la serializzazione applicando l'attributo [DataContract] alla classe, solo i membri della classe che ha attributo [DataMember] verrà serializzato:

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

    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

In alcuni casi più complessi l'utilizzo di [IgnoreDataMember] può risolvi il tuo problema (Vedere http://msdn.microsoft.com/en-us/library/ms733127.aspx)

Tra l'altro, è possibile serializzare i campi e proprietà, a prescindere di accessibilità: private, protected, internal, protected internal o public. È possibile serializzare qualsiasi proprietà di lettura/scrittura e non solo campi. Informazioni sulla serializzazione dei tipi di raccolta vedi http://msdn.microsoft.com/en-us/library/aa347850.aspx.

6

Un modo per farlo è quello di impostare la proprietà EmitDefaultValue del DataMemberAttribute su false:

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

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

    [DataMember] 
    public string DM3; 
} 

quindi impostando questa proprietà su null:

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

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

    return mdc; 
} 

In questo modo, che la proprietà non lo fa essere scritti nel flusso di output sulla serializzazione.

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

+0

che funziona se sto creando una copia dell'oggetto reale che voglio serializzare, e don' t cura di cambiare la copia. Tuttavia, mi piacerebbe farlo senza modificare l'oggetto che sto cercando di serializzare. – floatingfrisbee