System.Formats.Cbor DateTimeOffset-opmaakwijziging
Omdat het werd uitgebracht in .NET 5, bevatte het NuGet-pakket System.Formats.Cbor ingebouwde methoden voor het serialiseren en deserialiseren van DateTimeOffset-waarden volgens RFC 7049. Helaas hebben de implementaties geen invariante cultuur gebruikt bij het opmaken en parseren van DateTimeOffset-waarden. Dit heeft geresulteerd in inconsistente of zelfs onjuiste datumcoderingen op computers met culturen die gebruikmaken van niet-Gregoriaanse kalenders.
Het gedrag is gewijzigd, zodat de invariante cultuur altijd wordt gebruikt bij het parseren en opmaken van DateTimeOffset-waarden. Deze wijziging kan uw code verbreken als u afhankelijk was van het vorige gedrag. Het kan ook onmogelijk zijn om datumwaarden te lezen die zijn gecodeerd met eerdere versies van het NuGet-pakket System.Formats.Cbor.
Versie geïntroduceerd
.NET 8
Vorig gedrag
Houd rekening met deze code die een DateTimeOffset-waarde uit een tekenreeks parseert en deze code vervolgens codeert met behulp van CBOR:
// 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));
Voorheen heeft deze code de volgende CBOR-codering geproduceerd:
C07828D7AAD7A922D7A42DD796272DD79822D7955431343A33313A32312E333533353934312B30313A3030
Deze codering komt overeen met 0(תש\"פ-ז'-ט\"וT14:31:21.3535941+01:00)
in de diagnostische CBOR-notatie. Dit is een ongeldige datumweergave per RFC 7049.
Nieuw gedrag
Vanaf .NET 8 produceert dezelfde code de volgende CBOR-codering:
C07821323032302D30342D30395431343A33313A32312E333533353934312B30313A3030
Deze codering komt overeen met 0("2020-04-09T14:31:21.3535941+01:00")
in de diagnostische CBOR-notatie.
Type wijziging die fouten veroorzaken
Deze wijziging is een gedragswijziging.
Reden voor wijziging
Het vorige gedrag heeft ongeldige datumcoderingen geproduceerd per RFC 7049.
Aanbevolen actie
Mogelijk moet u CBOR-datumcoderingen lezen die zijn behouden met eerdere versies van System.Formats.Cbor als u geen upgrade uitvoert naar de nieuwste versie van het NuGet-pakket System.Formats.Cbor.
U kunt uw code ook wijzigen om de volgende extensiemethode te gebruiken:
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);
}
}
Gebruik deze extensiemethode om een CBOR-datumcodering als volgt te lezen:
var reader = new CborReader(cborEncoding);
DateTimeOffset date = reader.ReadDateTimeOffsetReplacement(culture);
Console.WriteLine(date.ToString(CultureInfo.InvariantCulture));