2010-02-28 31 views
5

sağ diyor .NET XmlIgnoreAttribute, anlamada Am I:XmlIgnoreAttribute, seri hale getirme sırasında değil, yalnızca seri hale getirme sırasında kullanılır?

/kamu alanını veya kamu okuma seri özellik değerini yazmak için değil XmlSerializer serialize yöntemini talimatını verir.

o:

  • mülkiyet serisi kaldırılan olacak, XML dosyasındaki eğer mevcut?
  • Özellik yeni bir XML dosyasına serileştirilmeyecek mi?

Sormamın nedeni, dosyadaki bir özelliği, yeni bir seçenekle daha fazla seçenekle değiştirdiğim. Eski mülk basit bir boole mülküydü ve yeni olan bir enum. Eski özelliği değiştirdim, böylece yeni mülkün ne anlama geldiğine göre, yeni mülkün değerini bir boole değerine dönüştürür.

Bu özellik, yeni özelliği ayarlayan eski özelliği okuyarak yeni dosyaları sessizce yükseltmeme izin verdi ve serileştirme sonrasında yeni özellik eklendi.

Ancak, eski xml dosyasındaki eski özelliği kaldırmak istiyorum, bu yüzden ben [XmlIgnore] ile etiketlenmiş olsaydım, eski xml dosyası düzgün bir şekilde seriyi seri hale getirip bu özelliği dosyadan okuyabilseydim ne olacağını merak ediyordum, ya da Tamamen göz ardı edilir mi?

Değilse, aşağıdaki değişiklik istediğimi yapar mı?

[XmlAttribute("is-list")] 
[DefaultValue(false)] 
public bool IsList 
{ 
    get { return false; } 
    set { 
     if (value) 
      ListHandling = ListHandling.All; 
    } 
} 

Bu benim varsayılan bir değer belirttiniz beri göz ardı edileceği tüm yeni nesneler için return false ve eğer varsa eski dosyada, ve gerçek olarak ayarlanmış olur, yani, hangi ListHandling özelliğini değiştirecek önemli olan yeni olan.

Düzenle: Sınama üzerine, her iki yaklaşımın da istediğimi yapmakta olduğu doğrulandı. Yine de, yukarıda belirtilen ilk davranışın sadece bir uygulama detayı mı, yoksa belgelerin bu şekilde anlaşılıp anlaşılmayacağını bilmek isterim.

cevap

2

Bir özelliği XmlIgnore ile etiketlerseniz, yok sayılır. XmlSerializer seri hale getirme derlemesini oluşturduğunda dikkate alınmaz. Bu nedenle, XmlIgnore-d özellikleri, seri hale getirme sırasında doldurulmaz ve varsayılan değerleriyle bırakılır. (Snippet Compiler için)

Örnek program:

public static void RunSnippet() 
{ 
    XmlSerializer ser = new XmlSerializer(typeof(Fie)); 
    Fie f = (Fie)(ser.Deserialize(new StringReader("<Fie><Bob>Hello</Bob></Fie>"))); 
    WL(f.Bob == null ? "null" : "something"); 
} 

public class Fie 
{ 
    [XmlIgnore] 
    public string Bob { get; set; } 
} 

bu programdan çıkış null olduğunu (ve Fie.Bob gelen XmlIgnore kaldırırsanız çıkış something olduğunu).

Düzenlemeye yanıt olarak düzenleme: Bu yalnızca bir uygulama detayı değildir; gerçekten özniteliğin belgelenmiş davranışıdır.the docs'un Açıklamalar bölümünden (ilk paragraf): "Bir sınıfın herhangi bir üyesine XmlIgnoreAttribute uygularsanız, serileştirirken XmlSerializer üye yok sayar veya sınıfın bir örneğini deserializing." (vurgusu eklendi)

+0

Tamam, teşekkürler, o zaman testimin ne yaptığını göstermesi çok şanssızlıktı. sanırım ikinci uygulamamı kullanmak istediğim odur. –

+0

[XmlIgnore] öğesini alt sınıf/geçersiz kılınan bir özelliğe koyarsanız, özellik göz ardı edilir ve değer serileştirilir ve serileştirilir. – Sven

İlgili konular