Delen via


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.

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));

Betrokken API's