System.Formats.Cbor DateTimeOffset-Formatierungsänderung
Seit es in .NET 5 veröffentlicht wurde, enthielt das NuGet-Paket System.Formats.Cbor integrierte Methoden zum Serialisieren und Deserialisieren von DateTimeOffset-Werten gemäß RFC 7049. Leider verwendeten die Implementierungen beim Formatieren und Parsen von DateTimeOffset-Werten keine invarianter Kultur. Dies führte zu inkonsistenten oder sogar falschen Datumscodierungen auf Computern mit Kulturen, die nicht-gregorianische Kalender verwenden.
Das Verhalten wurde geändert, sodass beim Parsen und Formatieren von DateTimeOffset-Werten immer eine invariante Kultur verwendet wird. Diese Änderung kann ihren Code unterbrechen, wenn Sie auf das vorherige Verhalten verlassen hatten. Außerdem könnte es unmöglich sein, Datumswerte zu lesen, die mit früheren Versionen des Pakets System.Formats.Cbor NuGet codiert wurden.
Eingeführt in Version
.NET 8
Vorheriges Verhalten
Erwägen Sie diesen Code, der einen DateTimeOffset-Wert aus einer Zeichenfolge parst und dann mit CBOR codiert:
// 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));
Zuvor hat dieser Code die folgende CBOR-Codierung erstellt:
C07828D7AAD7A922D7A42DD796272DD79822D7955431343A33313A32312E333533353934312B30313A3030
Diese Codierung entspricht 0(תש\"פ-ז'-ט\"וT14:31:21.3535941+01:00)
in der CBOR-Diagnosenotation, bei der es sich um eine ungültige Datumsdarstellung nach RFC 7049 handelt.
Neues Verhalten
Ab .NET 8 erzeugt derselbe Code die folgende CBOR-Codierung:
C07821323032302D30342D30395431343A33313A32312E333533353934312B30313A3030
Diese Codierung entspricht 0("2020-04-09T14:31:21.3535941+01:00")
in der CBOR-Diagnosenotation.
Typ des Breaking Changes
Diese Änderung ist eine Verhaltensänderung.
Grund für die Änderung
Das vorherige Verhalten hat ungültige Datumscodierungen nach RFC 7049 erzeugt.
Empfohlene Maßnahme
Möglicherweise müssen Sie CBOR-Datumscodierungen lesen können, die mit früheren Versionen von System.Formats.Cbor beibehalten wurden, wenn Sie kein Upgrade auf die neueste Version des NuGet-Pakets System.Formats.Cbor NuGet durchführen.
Alternativ können Sie ihren Code ändern, um die folgende Erweiterungsmethode zu verwenden:
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);
}
}
Verwenden Sie diese Erweiterungsmethode, um eine CBOR-Datumscodierung wie folgt zu lesen:
var reader = new CborReader(cborEncoding);
DateTimeOffset date = reader.ReadDateTimeOffsetReplacement(culture);
Console.WriteLine(date.ToString(CultureInfo.InvariantCulture));