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.
Çok biçimlilik ve başvuru koruması gibi belirli bağlamlar altında, System.Text.Json meta verileri yayma amacıyla belirli özellik adlarını (örneğin, $type, $idve $ref) ayırır. gibi TypeDiscriminatorPropertyName bazı özellik adları da özel adlarla yapılandırılabilir. Daha önce seri hale getirici, bu özellik adlarının kullanıcı tanımlı sözleşmelerle çakışıp çakışmadığı konusunda doğrulama gerçekleştirmedi; bu da yinelenen özelliklere neden olabilir ve belirsiz olan veya gidiş dönüş yapamayan JSON üretebilir. .NET 10'dan başlayarak, System.Text.Json bu tür yapılandırmaları önlemek için doğrulamayı etkinleştirir ve kullanıcılara erken uyarı sağlar.
Sürüm kullanıma sunulmuştur
.NET 10
Önceki davranış
Daha önce, aşağıdaki kod yinelenen Type özelliklere sahip geçersiz bir JSON nesnesi üretti ve JsonException ile seriden çıkarılamadı.
using System.Text.Json;
using System.Text.Json.Serialization;
string json = JsonSerializer.Serialize<Animal>(new Dog());
Console.WriteLine(json); // {"Type":"dog","Type":"Dog"}
JsonSerializer.Deserialize<Animal>(json); // JsonException: Deserialized object contains a duplicate 'Type' metadata property.
[JsonPolymorphic(TypeDiscriminatorPropertyName = "Type")]
[JsonDerivedType(typeof(Dog), "dog")]
public abstract class Animal
{
public abstract string Type { get; }
}
public class Dog : Animal
{
public override string Type => "Dog";
}
Yeni davranış
.NET 10'dan başlayarak, aynı türü seri hale getirme girişimleri erken doğrulama hatasıyla sonuçlanır:
InvalidOperationException: 'Dog' türü, mevcut meta veri özellik adıyla çakişen 'Type' özelliğini içerir. JsonIgnoreAttribute ile yeniden adlandırmayı veya yoksaymayı göz önünde bulundurun.
Bu doğrulama hatası, seri hale getirici ilk kez oluşturulduğunda veya serileştirme ilk kez denendiğinde, geçersiz serileştirme sözleşmelerinin erken algılanması sağlandığında oluşur.
Kesinti yaratan değişiklik türü
Bu değişiklik davranışsal bir değişikliktir.
Değişiklik nedeni
Bu değişiklik, geçersiz serileştirme sözleşmelerinin erken önlenmesini sağlar. Özellik adlarını önceden doğrulayarak, seri hale getirici yinelenen özelliklerin yayılacağı senaryoları önler ve bu da doğru gidiş dönüş yapamayan geçersiz JSON ile sonuçlanır. Bu, geliştiricilerin geliştirme sırasındaki yapılandırma sorunlarını belirlemelerine ve düzeltmelerine yardımcı olur, böylece bu sorunlar seri durumdan çıkarma sırasında çalışma zamanında keşfedilmez.
Daha fazla bilgi için bakınız:
- [STJ] Meta veri özellik adlarıyla çakışan özellik adlarına izin vermez (dotnet/runtime#106390)
- Meta verilerle çakışan özellik adlarına sahip türlere izin verme (dotnet/runtime#106460)
Önerilen eylem
System.Text.Json'a özgü meta veri özellikleriyle (, ve $typegibi$id$ref) çakışan özellik adlarını kullanmaktan kaçının. Böyle bir özelliği sınıfta tutmak kesinlikle gerekliyse çakışan özelliğe bir JsonIgnoreAttribute ek açıklama uygulayın.