Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
.NET 10'dan itibaren, `XmlSerializer` özniteliği ile işaretlenmiş özellikleri işleme biçimi `ObsoleteAttribute` için değişti. Daha önce, ile [Obsolete] işaretlenen özellikler de ile [XmlIgnore]işaretlenmiş gibi ele alınıyordu ve bu da XML serileştirmesinin dışında tutulmasına neden oluyordu. Bu davranış istenmeyen bir davranıştır ve düzeltilmiştir.
Bu değişiklikle, [Obsolete] ile işaretlenmiş özellikler artık varsayılan olarak serileştirilir, ancak IsError özelliği true olarak ayarlanırsa bu işlem gerçekleşmez.
IsError
true ise, seri hale getirici oluşturma sırasında bir InvalidOperationException fırlatır. Ayrıca, geliştiricilerin gerekirse önceki davranışa geri dönmelerine olanak sağlayan bir AppContext anahtarı Switch.System.Xml.IgnoreObsoleteMemberskullanıma sunulmuştur.
Sürüm kullanıma sunulmuştur
.NET 10
Önceki davranış
.NET'in önceki sürümlerinde, [Obsolete] özniteliğiyle işaretlenmiş özellikler, [XmlIgnore] özniteliğiyle işaretlenmiş özelliklere benzer şekilde XML serileştirmeden hariç tutuluyordu. Bu davranış beklenmeyen bir davranıştı ve özniteliğin [Obsolete] kullanım dışı api'ler hakkında derleme zamanı uyarıları sağlayan amaçlanan amacına uygun değildi.
public class Example
{
public string NormalProperty { get; set; } = "normal";
[Obsolete("This property is deprecated")]
public string ObsoleteProperty { get; set; } = "obsolete";
[XmlIgnore]
public string IgnoredProperty { get; set; } = "ignored";
}
var obj = new Example();
var serializer = new XmlSerializer(typeof(Example));
using var writer = new StringWriter();
serializer.Serialize(writer, obj);
Console.WriteLine(writer.ToString());
Değişiklik öncesi çıkış:
<Example>
<NormalProperty>normal</NormalProperty>
</Example>
Yeni davranış
.NET 10'dan başlayarak, ile [Obsolete] işaretlenen özellikler artık varsayılan olarak XML serileştirmesinin dışında tutulmaz. Yerine:
-
[Obsolete]özniteliği (varsayılan) ileIsError = falseuygulanırsa, özellik normal şekilde serileştirilir. -
[Obsolete]özniteliği ileIsError = trueXmlSerializer uygulanırsa, seri hale getirici oluşturma sırasında bir InvalidOperationException oluşturur.
Önceki davranış bölümünde gösterildiği gibi aynı kodu kullanarak, değişiklik sonrasındaki çıkış şu şekildedir:
<Example>
<NormalProperty>normal</NormalProperty>
<ObsoleteProperty>obsolete</ObsoleteProperty>
</Example>
Bir özelliğe [Obsolete(IsError = true)] uygulanırsa, seri hale getirici oluşturma sırasında aşağıdaki istisna atılır:
System.InvalidOperationException: 'ObsoleteProperty' üyesi ObsoleteAttribute ile işaretlendiğinden ve IsError true olarak ayarlandığından serileştirilemiyor.
Uyarı
olarak [Obsolete] işaretlenen özellikler, XML'de veriler mevcut olduğunda her zaman başarıyla seri durumdan çıkarılır. Bu değişiklik, özelliklerin nesneden XML'ye ve nesneye geri "gidiş dönüş" yapmasına izin verirken [Obsolete] , yeni davranış yalnızca "gidiş dönüş" işleminin serileştirme yarısını (nesneden XML'ye) etkiler.
Kesinti yaratan değişiklik türü
Bu değişiklik davranışsal bir değişikliktir.
Değişiklik nedeni
[Obsolete] özniteliğini [XmlIgnore] ile eşdeğer şekilde işleme önceki davranışı, [Obsolete] özniteliğinin amacına göre istenmeyendi ve tutarsızdı. Bu değişiklik, [Obsolete]'nin yalnızca derleme zamanı uyarıları sağlama amacıyla kullanılmasını ve çalışma zamanı serileştirme davranışını etkilememesini sağlar. AppContext anahtarının kullanıma sunulması, geliştiricilerin gerekirse eski davranışı kabul etmesini sağlar.
Önerilen eylem
Özelliklerin XML serileştirmesinin dışında bırakıldığı [Obsolete] önceki davranışa bağlı olup olmadığınız için kod tabanınızı gözden geçirin. Bu davranış yine de isteniyorsa AppContext anahtarını Switch.System.Xml.IgnoreObsoleteMembers aşağıdaki gibi etkinleştirin:
AppContext.SetSwitch("Switch.System.Xml.IgnoreObsoleteMembers", true);
Herhangi bir özellik [Obsolete(IsError = true)] ile işaretlenmişse ve bu özellikler seri hale getiriliyorsa, çalışma zamanı hatalarını önlemek için kodu güncelleyerek ya [Obsolete] özniteliğini kaldırın ya da IsError = false ayarlayın.