2010-07-29 6 views
5

Ich habe eine Datacontract wie dieseKann ich verhindern, dass ein bestimmtes Datamember deserialisiert wird?

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

    [DataMember] 
    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

und manchmal I DM2 verhindern mag, dass deserialisiert wird, wenn von einer Operation zurückgegeben werden. Etwas wie folgt aus:

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

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

    return mdc; 
} 

Ich konnte immer ein neues Datacontract, die nur DM1 und DM3 hat und erzeugen, dass von der MyDC Instanz aber ich möchte sehen, ob es möglich ist, programmatisch DM2 zu entfernen. Ist es möglich? Wie?

Antwort

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

Dann IsDM2Serializable auf false gesetzt, wenn Sie es verstecken müssen:

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

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

    return mdc; 
} 
3

Was Sie meinen, ist Serialisierung und keine Deserialisierung.

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

    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

in einigen komplexeren Fällen die Verwendung von [IgnoreDataMember]:

Wenn Sie eine Klasse für die Serialisierung der Anwendung des [DataContract] Attribut auf die Klasse vorzubereiten, nur die Mitglieder der Klasse, die [DataMember] Attribut wird serialisiert werden löse dein Problem. (Siehe http://msdn.microsoft.com/en-us/library/ms733127.aspx)

By the way, Sie Felder und Eigenschaften serialisiert werden können, und zwar unabhängig von Zugänglichkeit: private, protected, internal, protected internal oder public. Sie können alle Lese-/Schreibeigenschaften und nicht nur Felder serialisieren. Informationen zur Serialisierung von Sammlungsarten finden Sie unter http://msdn.microsoft.com/en-us/library/aa347850.aspx.

6

Eine Möglichkeit, dies zu tun, ist die EmitDefaultValue Eigenschaft des Datamember auf false gesetzt:

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

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

    [DataMember] 
    public string DM3; 
} 

Dann diese Eigenschaft auf null setzen:

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

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

    return mdc; 
} 

Auf diese Weise, dass das Eigentum nicht Bei der Serialisierung in den Ausgabestream geschrieben werden.

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

+0

Das funktioniert, wenn ich eine Kopie des eigentlichen Objekts erschaffe ich serialisiert werden soll, und don‘ Es ist wichtig, die Kopie zu ändern. Allerdings möchte ich es tun, ohne das Objekt zu ändern, das ich serialisieren möchte. – floatingfrisbee