Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Depuis sa publication dans .NET 5, le package NuGet System.Formats.Cbor inclut des méthodes intégrées pour la sérialisation et la désérialisation des valeurs DateTimeOffset en fonction de RFC 7049. Malheureusement, les implémentations n’utilisaient pas de culture invariante lors de la mise en forme et de l’analyse des valeurs DateTimeOffset. Cela a entraîné des encodages de date incohérents ou même incorrects sur des machines avec des cultures qui utilisent des calendriers non grégoriens.
Le comportement a été modifié afin que la culture invariante soit toujours utilisée lors de l'interprétation et du formatage des valeurs DateTimeOffset. Cette modification peut interrompre votre code si vous vous appuyez sur le comportement précédent. En outre, il peut être impossible de lire les valeurs de date qui ont été encodées avec les 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 encode à l’aide de 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));
Auparavant, ce code produisait 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 le RFC 7049.
Nouveau comportement
À compter de .NET 8, le même code produit l’encodage CBOR suivant :
C07821323032302D30342D30395431343A33313A32312E333533353934312B30313A3030
Cet encodage correspond à 0("2020-04-09T14:31:21.3535941+01:00") la notation de diagnostic CBOR.
Type de changement cassant
Ce changement est un changement de comportement.
Raison de la modification
Le comportement précédent a produit des encodages de date non valides par RFC 7049.
Action recommandée
Vous devrez peut-être lire les encodages de date CBOR qui ont été conservés à l’aide des versions antérieures de System.Formats.Cbor si vous ne 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));