2009-02-26 13 views
10

ile bir özellik geçersiz kılma.Bir özelliğin seri davranışını değiştirmek için bir yol bulmaya çalışıyorum bir öznitelik

[Serializable] 
public class Record 
{ 
    public DateTime LastUpdated {get; set; } 

    // other useful properties ... 
} 

public class EmployeeRecord : Record 
{ 
    public string EmployeeName {get; set; } 

    // other useful properties ... 
} 

Şimdi EmployeeRecord seri hale getirmek istiyorum:

Böyle bir durum var düşünelim. LastUpdated özelliğinin Record sınıfından serileştirilmesini istemiyorum. (Kayıtları serileştirdiğimde LastUpdated'in seri hale getirilmesini istiyorum).

Önce XmlIgnore niteliğini yeni anahtar kelime kullanarak ve sonra ekleyerek LastUpdated özelliğini gizleme çalıştı:

public class EmployeeRecord : Record 
{ 
    public string EmployeeName {get; set; } 

    [XmlIgnore] 
    public new DateTime LastUpdated {get; set; } 
    // other useful properties ... 
} 

Ama bu işe yaramadı. Sonra niteliğini tutarak baz sanal LastUpdated yapma ve bunu geçersiz kılma çalıştı:

[Serializable] 
public class Record 
{ 
    public virtual DateTime LastUpdated {get; set; } 

    // other useful properties ... 
} 

public class EmployeeRecord : Record 
{ 
    public string EmployeeName {get; set; } 

    [XmlIgnore] 
    public override DateTime LastUpdated {get; set; } 
    // other useful properties ... 
} 

Bu da işe yaramadı. Her iki girişimde de, LastUpdated, XmlIgnore özniteliğini göz ardı etti ve serileştirme işini mutlu bir şekilde sürdürdü.

gerçekleşmesini yapmaya çalıştığım şey yapmak için bir yolu var mı?

+0

Nasıl serileştiriyorsunuz? Çünkü ikili serileştirme kullanıyorsanız, XmlIgnore özniteliği çok iyi olmaz. –

+0

XmlSerializer kullanıyorum –

+0

Ikili serileştirme için NonSerialized özniteliği kullanırsınız. – snarf

cevap

17

Birincisi, [Serializable] attr XmlSerializer ile ilgisi yoktur. Bu kırmızı bir ringa balığı. XmlSerializer System.Xml.Serialization'da çalışırken, [Serializable] System.Runtime.Serialization için anlamlıdır. Sınıfınızı [Serializable] ve [XmlIgnore] ile üyelerinizle süslüyorsanız, muhtemelen kendinizi veya kodunuzun diğer okuyucularını karıştırıyor olabilirsiniz. .NET

XmlSerialization çok esnektir. Serileştirmenin nasıl yapıldığına bağlı olarak, doğrudan sizin tarafınızdan veya dolaylı olarak, web hizmetleri çalışma zamanı tarafından söyleyelim - işleri kontrol etmenin farklı yolları vardır.

Bir seçenek özelliği kullanmaktır. XML Serileştirme özelliğini açmak veya kapatmak için belirtilen desen. LastModifiedSpecified örneği yanlış ise

Sonra
public class TypeA 
{ 
    public DateTime LastModified; 
    [XmlIgnore] 
    public bool LastModifiedSpecified; 
} 

, LastModified alanda bu örneği için getirilemez olacaktır: Bu kod olduğunu varsayalım. Yapıcınız için yapıcıda, LastModifiedSpecified değerini her zaman temel türünde doğru olacak şekilde ve türetilmiş türde her zaman false olarak ayarlayabilirsiniz. Gerçek boolean - LastModifiedSpecified - XmlIgnore işaretlendiğinden asla serileştirilmez.

Bu küçük hile here belgelenmiştir.

Diğer seçenek dinamik XML seri niteliklerin kümesi sağlayarak bir yoludur XmlAttributeOverrides, (böylece XmlElementAttribute, XmlIgnoreAttribute, XmlRootAttribute, benzeri ve ...) kullanmaktır - dinamik olarak çalışma zamanında serileştiriciye için bu özellikleri sağlayan . XmlSerializer, bu özniteliklerin türünü denetlemek yerine, yapıcısına sağlanan geçersiz kılma özniteliklerinin listesini yürütür.

var overrides = new XmlAttributeOverrides(); 
    // ....fill the overrides here.... 
    // create a new instance of the serializer specifying overrides 
    var s1 = new XmlSerializer(typeof(Foo), overrides); 
    // serialize as normal, here. 

Bu

daha detaylı here gösterilmektedir. türetilmiş tür seri hale yalnızca Senin durumunda

, bir geçersiz kılma gibi bir XmlIgnoreAttribute sağlar, ancak ederim.(veya her neyse) Bu, yalnızca XmlSerializer'ı doğrudan başlattığınızda çalışır - seri hale getirme, web hizmetlerinde olduğu gibi çalışma zamanı tarafından dolaylı olarak yapıldığında işe yaramaz.

Şerefe!

+0

Vay, daha önce Belirtilen desenini bile duymamıştım. Bir çekicilik gibi çalıştı! –

8

aklıma gelen en iyi ... Temelde

[Serializable] 
public class Record 
{ 
    public DateTime LastUpdated {get; set; } 
    public virtual bool ShouldSerializeLastUpdated() {return true;} 
    // other useful properties ... 
} 

public class EmployeeRecord : Record 
{ 
    public string EmployeeName {get; set; } 
    public override bool ShouldSerializeLastUpdated() {return false;} 
    // other useful properties ... 
} 

, birkaç desenler XmlSerializer saygı vardır; public bool ShouldSerialize*() ve public bool *Specified {get;set;} (*Specified'u [XmlIgnore] ile işaretlemelisiniz).

Çok zarif değil, vereceğim; Ancak XmlSerializer yalnızca herkese açık üyelere bakar, bu yüzden onları gizleyemezsiniz ([EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]'dan kısa).

İlgili konular