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 5'te kullanıma sunulduğundan, System.Formats.Cbor NuGet paketi RFC 7049'a göre DateTimeOffset değerlerini seri hale getirmek ve seri durumdan kaldırmak için yerleşik yöntemler içeriyordu. Ne yazık ki, uygulamalar DateTimeOffset değerlerini biçimlendirirken ve ayrıştırırken sabit kültür kullanmadı. Bu, Gregoryen olmayan takvimler kullanan kültürlere sahip makinelerde tutarsız ve hatta yanlış tarih kodlamalarıyla sonuçlandı.
Davranış, DateTimeOffset değerleri ayrıştırılırken ve biçimlendirilirken sabit kültürün her zaman kullanılması için değiştirildi. Önceki davranışa bağlıysanız bu değişiklik kodunuzu bozabilir. Ayrıca, System.Formats.Cbor NuGet paketinin önceki sürümleriyle kodlanmış tarih değerlerini okumak mümkün olmayabilir.
Sürüm kullanıma sunulmuştur
.NET 8
Önceki davranış
Bir dizeden bir DateTimeOffset değerini ayrıştıran ve ardından CBOR kullanarak kodlayan bu kodu göz önünde bulundurun:
// Install a culture with a non-Gregorian calendar
var culture = new CultureInfo("he-IL");
culture.DateTimeFormat.Calendar = new HebrewCalendar();
Thread.CurrentThread.CurrentCulture = culture;
DateTimeOffset value = DateTimeOffset.Parse("2020-04-09T14:31:21.3535941+01:00", CultureInfo.InvariantCulture);
var writer = new CborWriter();
writer.WriteDateTimeOffset(value);
byte[] cborEncoding = writer.Encode();
Console.WriteLine(Convert.ToHexString(cborEncoding));
Daha önce bu kod aşağıdaki CBOR kodlamasını üretti:
C07828D7AAD7A922D7A42DD796272DD79822D7955431343A33313A32312E333533353934312B30313A3030
Bu kodlama, CBOR tanılama gösteriminde 0(תש\"פ-ז'-ט\"וT14:31:21.3535941+01:00)'ye karşılık gelir, ki bu, RFC 7049 uyarınca geçersiz tarih gösterimidir.
Yeni davranış
.NET 8'den başlayarak, aynı kod aşağıdaki CBOR kodlamasını oluşturur:
C07821323032302D30342D30395431343A33313A32312E333533353934312B30313A3030
Bu kodlama, CBOR tanılama gösteriminde 0("2020-04-09T14:31:21.3535941+01:00") öğesine karşılık gelir.
Kesinti yaratan değişiklik türü
Bu değişiklik davranışsal bir değişikliktir.
Değişiklik nedeni
Önceki davranış RFC 7049 başına geçersiz tarih kodlamaları üretmiş.
Önerilen eylem
System.Formats.Cbor NuGet paketinin en son sürümüne yükseltmediyseniz, System.Formats.Cbor'un önceki sürümleri kullanılarak kalıcı hale gelen CBOR tarih kodlamalarını okuyabilmeniz gerekebilir.
Alternatif olarak, kodunuzu aşağıdaki uzantı yöntemini kullanacak şekilde değiştirebilirsiniz:
public static class CborReaderExtensions
{
private const string Rfc3339FormatString = "yyyy-MM-ddTHH:mm:ss.FFFFFFFK";
public static DateTimeOffset ReadDateTimeOffsetReplacement(this CborReader reader, CultureInfo? cultureInfo = null)
{
CborTag tag = reader.PeekTag();
if (tag != CborTag.DateTimeString)
{
throw new InvalidOperationException($"Expected CborTag {(int)CborTag.DateTimeString}");
}
reader.ReadTag();
string dateString = reader.ReadTextString();
return DateTimeOffset.ParseExact(dateString, Rfc3339FormatString, cultureInfo, DateTimeStyles. RoundtripKind);
}
}
CBOR tarih kodlamasını aşağıdaki gibi okumak için bu uzantı yöntemini kullanın:
var reader = new CborReader(cborEncoding);
DateTimeOffset date = reader.ReadDateTimeOffsetReplacement(culture);
Console.WriteLine(date.ToString(CultureInfo.InvariantCulture));