2010-07-29 19 views
5

J'ai un DataContract comme celui-ciPuis-je empêcher la désérialisation d'un datamember spécifique?

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

    [DataMember] 
    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

et parfois Je veux éviter DM2 d'être désérialisé lors de son retour d'un OperationContract. Quelque chose comme ceci:

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

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

    return mdc; 
} 

je pouvais toujours faire une nouvelle DataContract qui a seulement DM1 et DM3 et générer que de l'instance MYDC mais je veux voir s'il est possible d'enlever programatically DM2. C'est possible? Comment?

Répondre

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

Réglez ensuite IsDM2Serializable false lorsque vous avez besoin de le cacher:

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

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

    return mdc; 
} 
3

Ce que vous voulez dire, c'est la sérialisation et non la désérialisation.

Si vous préparez une classe pour la sérialisation appliquer l'attribut [DataContract] à la classe, seuls les membres de la classe qui a [DataMember] attribut est sérialisée:

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

    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

Dans certains cas plus complexes, l'utilisation de [IgnoreDataMember] peut Résolvez votre problème. (Voir http://msdn.microsoft.com/en-us/library/ms733127.aspx)

Par ailleurs, vous pouvez sérialiser champs et propriétés, quelle que soit l'accessibilité: private, protected, internal, protected internal ou public. Vous pouvez sérialiser toutes les propriétés de lecture/écriture et pas seulement les champs. À propos de la sérialisation des types de collection, voir http://msdn.microsoft.com/en-us/library/aa347850.aspx.

6

Une façon de le faire est de définir la propriété EmitDefaultValue du DataMemberAttribute false:

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

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

    [DataMember] 
    public string DM3; 
} 

, cette propriété mise à null:

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

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

    return mdc; 
} 

De cette façon, cette propriété ne être écrit dans le flux de sortie sur la sérialisation.

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

+0

Cela fonctionne si je crée une copie de l'objet réel que je veux sérialisation, et n » t soin de changer la copie. Cependant, je voudrais le faire sans changer l'objet que j'essaie de sérialiser. – floatingfrisbee