Aws-sdk-net: لا يدعم DateTime التسلسل ذهابًا وإيابًا مع DocumentModel

تم إنشاؤها على ٢ يوليو ٢٠١٤  ·  3تعليقات  ·  مصدر: aws/aws-sdk-net

لا يدعم DocumentModel Primitive بشكل صحيح التسلسل ذهابًا وإيابًا. يجب أن يستخدم محدد التنسيق "o" عند إجراء تسلسل لـ DateTime لضمان الحفاظ على المنطقة الزمنية والميلي ثانية بشكل صحيح.

لقد قمت بإنشاء IPropertyConverter أدناه لتوضيح التسلسل الصحيح لـ DateTime و NullableDateTime.

using Amazon.DynamoDBv2.DataModel;
using Amazon.DynamoDBv2.DocumentModel;
using System.Globalization;

/// <summary>
/// The <see cref="IPropertyConverter"/> to properly support round-trip serialization of <see cref="DateTime"/>.
/// </summary>
public class RoundTripNullableDateTimeTypeConverter : IPropertyConverter
{
    /// <summary>
    /// Converts the <c>value</c> to a <see cref="Primitive"/>.
    /// </summary>
    /// <param name="value">The value to convert.</param>
    /// <returns>The primitive of the <c>value</c>.</returns>
    public DynamoDBEntry ToEntry(object value)
    {
        var date = value as DateTime?;
        return new Primitive 
        {
            Value = date.HasValue ? date.Value.ToString("o", CultureInfo.InvariantCulture) : null
        };
    }

    /// <summary>
    /// Converts the <c>entry</c> to <see cref="DateTime"/>.
    /// </summary>
    /// <param name="entry">The entry to convert.</param>
    /// <returns>The date time of the entry.</returns>
    public object FromEntry(DynamoDBEntry entry)
    {
        var entryString = entry.AsString();
        if (string.IsNullOrEmpty(entryString))
            return null;
        else
            return DateTime.ParseExact(entryString, "o", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
    }
}

/// <summary>
/// The <see cref="IPropertyConverter"/> to properly support round-trip serialization of <see cref="DateTime"/>.
/// </summary>
public class RoundTripDateTimeTypeConverter : IPropertyConverter
{
    /// <summary>
    /// Converts the <c>value</c> to a <see cref="Primitive"/>.
    /// </summary>
    /// <param name="value">The value to convert.</param>
    /// <returns>The primitive of the <c>value</c>.</returns>
    public DynamoDBEntry ToEntry(object value)
    {
        return new Primitive
        {
            Value = ((DateTime)value).ToString("o", CultureInfo.InvariantCulture)
        };
    }

    /// <summary>
    /// Converts the <c>entry</c> to <see cref="DateTime"/>.
    /// </summary>
    /// <param name="entry">The entry to convert.</param>
    /// <returns>The date time of the entry.</returns>
    public object FromEntry(DynamoDBEntry entry)
    {
        return DateTime.ParseExact(entry.AsString(), "o", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
    }
}

بعض المراجع المهمة:

ال 3 كومينتر

شكرا لجلب هذا الأمر. كما أشرت ، يستخدم التطبيق الحالي تنسيق ISO 8601 UTC ، والذي لا يخزن المنطقة الزمنية ولديه دقة أقل مما هو ممكن مع التنسيق "o".

تم اتخاذ القرار الأصلي لاستخدام هذا التنسيق عبر جميع حزم AWS SDK التي تطبق DynamoDB API عالي المستوى (جدول و DynamoDBContext في .NET ، DynamoDBMapper في Java ، إلخ.) يتيح تخزين التواريخ بتنسيق ISO 8601 UTC البحث والفرز المتسقين ، وهو أمر غير ممكن إذا تم تحديد المناطق الزمنية: لا تعني قيم السلسلة الأكبر بالضرورة قيم تاريخ "أكبر" ، ومن الممكن أن يكون لها تمثيلات متعددة لتاريخ "فريد" واحد. يمكن أن يتسبب هذا الأخير في حدوث مشكلات في جميع العمليات ، وليس عمليات البحث فقط (الاستعلام والمسح الضوئي): إذا تم تخزين عنصر مع DateTime كمفتاح بمنطقة زمنية محددة ، فلا يمكن استرداده إلا إذا تم استخدام نفس المنطقة الزمنية بالضبط. بناءً على كيفية تنظيم التطبيق ، قد يؤدي تغيير المنطقة الزمنية إلى فشل جميع مكالمات البيانات ، نظرًا لأن المفتاح لن يتطابق.

سيكون إجراء التغيير أعلاه على .NET SDK بمثابة تغيير جذري للمستخدمين الذين قد يستخدمون عدة SDK أو إصدارات مختلفة من .NET SDK ، نظرًا لأن العملاء غير المحدثين لن يتمكنوا من تحليل التنسيقات الجديدة. لكن المحولات المتوفرة هي طريقة ممتازة لتخزين التواريخ عالية الدقة مع المناطق الزمنية ، طالما تتم قراءة البيانات وكتابتها باستمرار باستخدام نفس التنسيق مع مراعاة بعض الاعتبارات المذكورة.

PavelSafronov ، شكرا على الرد!

كان السبب وراء طرحه هو سلوك غير متوقع لحفظ تاريخ UTC ثم عند جلب العنصر عاد في المنطقة الزمنية المحلية. هذا غير متوقع بالنسبة لمن يستخدم واجهة برمجة التطبيقات لتخزين البيانات واستردادها بشكل صحيح باستخدام التوقيت العالمي المنسق (UTC). تفترض واجهة برمجة التطبيقات (API) أن DateTime الوارد ليس بالتوقيت العالمي المنسق (UTC) ، لذلك يفترض أنه يجب أن يكون بالتوقيت المحلي عند إلغاء التسلسل. لذلك فإنه يقدم افتراضًا غير متسق.

لقد جمعت حزمة Nuget تسمى AWSSDK.DynamoDBv2.Converters لمساعدة الآخرين الذين يحتاجون إلى سلوك تسلسل ثابت للتواريخ. (المصدر موجود على جيثب .)

أتمنى أن تساعد هذه المعلومات الفريق.

يجب استخدام المحولات المرتبطة أعلاه إذا كان لديك حالة استخدام مماثلة مثلradleta. بالنسبة إلى SDK الرئيسي ، لن نقوم بتحديث التحويلات لأن ذلك سيحدث تغييرًا مفاجئًا.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات