2010-07-29 18 views
5

BuBelirli bir veri grubunun seri hale getirilmesini engelleyebilir miyim?

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

    [DataMember] 
    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

ve Bir OperationContract dönen edilirken serileştirilemezse olmaktan dm2 önlemek istiyorsanız bazen gibi bir DataContract var. Böyle bir şey:

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

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

    return mdc; 
} 

Hep yalnız DM1 ve DM3 sahip yeni DataContract yapıp MyDC örneğinden o üretir, ancak programlama yoluyla DM2'de kaldırmak mümkün olup olmadığını görmek istediğim başladı. Mümkün mü? Nasıl?

cevap

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

bunu gizlemek için gerektiğinde Sonra false IsDM2Serializable ayarlayın: Ben serialize istediğiniz gerçek nesnenin bir kopyasını oluşturma ve am çalışır

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

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

    return mdc; 
} 
3

Dizinin anlamı, serileştirme ve serileştirme değil. Eğer sınıfa [DataContract] özelliğini uygulayarak serileştirme için bir sınıf hazırlarsanız

, [DataMember] niteliği vardır sınıfın sadece üyeler tefrika edilecek: biraz daha karmaşık durumlarda

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

    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

[IgnoreDataMember] kullanımı can problemini çöz. Eğer erişilebilirlik bakılmaksızın, alanları ve özellikleri serileştirebilirsiniz arada

(http://msdn.microsoft.com/en-us/library/ms733127.aspx bakınız): private, protected, internal, protected internal veya public. Okuma/yazma özelliklerini ve sadece alanları serileştirebilirsiniz. Koleksiyon tiplerinin serileştirilmesi hakkında bkz. http://msdn.microsoft.com/en-us/library/aa347850.aspx. Bu özellik yok

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

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

    return mdc; 
} 

Bu arada:

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

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

    [DataMember] 
    public string DM3; 
} 

Sonra null Bu özelliği ayarlamak: Bunu yapmak için

İlgili konular