Partage via


Modification de la mise en forme de System.Formats.Cbor DateTimeOffset

Depuis sa publication dans .NET 5, le package NuGet System.Formats.Cbor comprenait des méthodes intégrées pour la sérialisation et la désérialisation des valeurs DateTimeOffset selon la norme RFC 7049. Malheureusement, les implémentations n’utilisaient pas la culture invariante lors de la mise en forme et de l’analyse des valeurs DateTimeOffset. Cela entraînait des encodages de date incohérents ou même incorrects sur des machines avec des cultures utilisant des calendriers non grégoriens.

Le comportement a été modifié afin que la culture invariante soit toujours utilisée lors de l’analyse et de la mise en forme des valeurs DateTimeOffset. Ce changement peut casser votre code si vous vous appuyez sur le comportement précédent. En outre, il peut être impossible de lire des valeurs de date encodées avec des versions antérieures du package NuGet System.Formats.Cbor.

Version introduite

.NET 8

Comportement précédent

Considérez ce code qui analyse une valeur DateTimeOffset à partir d’une chaîne, puis encodez-le en utilisant :

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

Auparavant, ce code générait l’encodage CBOR suivant :

C07828D7AAD7A922D7A42DD796272DD79822D7955431343A33313A32312E333533353934312B30313A3030

Cet encodage correspond à 0(תש\"פ-ז'-ט\"וT14:31:21.3535941+01:00) dans la notation de diagnostic CBOR qui est une représentation de date non valide selon la norme RFC 7049.

Nouveau comportement

À compter de .NET 8, le même code génère l’encodage CBOR suivant :

C07821323032302D30342D30395431343A33313A32312E333533353934312B30313A3030

Cet encodage correspond à 0("2020-04-09T14:31:21.3535941+01:00") dans la notation de diagnostic CBOR.

Type de changement cassant

Ce changement est un changement de comportement.

Raison du changement

Le comportement précédent a généré des encodages de date non valides selon la norme RFC 7049.

Il est possible que vous deviez lire les encodages de date CBOR qui ont été rendus persistants en utilisant des versions antérieures de System.Formats.Cbor si vous n’effectuez pas de mise à niveau vers la dernière version du package NuGet System.Formats.Cbor.

Vous pouvez également modifier votre code pour utiliser la méthode d’extension suivante :

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

Utilisez cette méthode d’extension pour lire un encodage de date CBOR comme suit :

var reader = new CborReader(cborEncoding);
DateTimeOffset date = reader.ReadDateTimeOffsetReplacement(culture);
Console.WriteLine(date.ToString(CultureInfo.InvariantCulture));

API affectées