Newtonsoft.json: أدت الترقية إلى .NET Core 3.1 إلى كسر تسلسل System.Version.

تم إنشاؤها على ٢٠ ديسمبر ٢٠١٩  ·  4تعليقات  ·  مصدر: JamesNK/Newtonsoft.Json

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

أدرك أيضًا أن هناك الكثير من تغطية الاختبار بالفعل على System.Version.

أنواع المصدر / الوجهة

        public class TestModel {
            public System.Version Version { get; set; }
            public System.Version2 Version2 { get; set; }
        }

JSON المتسلسل

{"Version":"1.0","Version2":{"Major":1,"Minor":0,"Build":-1,"Revision":-1,"MajorRevision":-1,"MinorRevision":-1}}

سلوك متوقع


أتوقع أن يخرج json السابق من أجل التوافق مع الإصدارات السابقة أو توفير محول حتى نحصل على إخراج طبيعي. لقد وجدت هذا فقط لأن Elasticsearch كانت تحاول إلغاء تسلسل هذه النماذج بعد أن قمنا بالترقية إلى .net core 3.1 من 2.2

ارتباط بالمصدر الحالي لـ .NET Core 3.x System.Version
https://github.com/dotnet/corefx/blame/master/src/Common/src/CoreLib/System/Version.cs
رابط إلى الإصدار 2.2 System السابق.
https://github.com/dotnet/corefx/blob/b3efd32a0c529240ce520839e28031d8beb84b85/src/Common/src/CoreLib/System/Version.cs

نظرت إلى المصدر وقارنت الاثنين ، إنها في الأساس جميع التغييرات الأساسية في ميزات اللغة الجديدة مثل أنواع المراجع الفارغة ، وأجسام التعبير.

تم إخراج الإصدارات مسبقًا كـ

{"Major":1,"Minor":0,"Build":-1,"Revision":-1,"MajorRevision":-1,"MinorRevision":-1}

تيار:

"1.0"

السلوك الفعلي

{"Version":"1.0","Version2":{"Major":1,"Minor":0,"Build":-1,"Revision":-1,"MajorRevision":-1,"MinorRevision":-1}}

خطوات التكاثر

يمكنك استخدام النموذج أعلاه أو يمكنك تشغيل هذا باستخدام حقل الإصدار فقط في تطبيق 2.2 وحدة التحكم ثم تغييره إلى 3.1 يجب أن يؤدي المهمة أيضًا.

بالنسبة إلى Version2 اكتب ، ما عليك سوى نسخ أحدث إصدار 2.2 corefx من System.Version الموجود هنا أو احصل عليه من جسدي هنا مع الحد الأدنى من التعديلات حتى يتم تجميعها.

            var model = new TestModel {
                Version = new Version(1, 0),
                Version2 = new Version2(1, 0)
            };

            string json = JsonConvert.SerializeObject(model, new JsonSerializerSettings());

التعليق الأكثر فائدة

شكرا على الرد. كان هذا هو أول ما فكرت به ، ولكن بعد ذلك لم أجد محول نوع في فئة الإصدار نفسها. جميل جدًا كيف لا توجد فئة محول نوع مباشرة على الإصدار / أي مرجع / وثائق توضح كيف ستتأثر. لم أر حتى سجل تغيير يوضح هذا السلوك الذي رأيته وهذا موجود عند تغيير التغييرات (تغيير كيفية حدوث التسلسل لنوع ما). حتى أنني بحثت في GitHub ولكني لم أر أي شيء. استغرق البحث في المشكلات وليس نتائج العثور على C # على GitHub (التي لم يكن هناك أي منها) للعثور عليها.

شكرا لك مرة أخرى!

المرجعي:
https://github.com/dotnet/corefx/pull/28516/files

ال 4 كومينتر

NET Core 3 لديه TypeConverter للإصدار: VersionConverter. يلتقطها Newtonsoft.Json تلقائيًا من TypeDescriptor.GetConverter(typeof(Version)) .

يمكنك كتابة JsonConverter للتحكم بشكل صريح في كيفية إجراء تسلسل للإصدار.

شكرا على الرد. كان هذا هو أول ما فكرت به ، ولكن بعد ذلك لم أجد محول نوع في فئة الإصدار نفسها. جميل جدًا كيف لا توجد فئة محول نوع مباشرة على الإصدار / أي مرجع / وثائق توضح كيف ستتأثر. لم أر حتى سجل تغيير يوضح هذا السلوك الذي رأيته وهذا موجود عند تغيير التغييرات (تغيير كيفية حدوث التسلسل لنوع ما). حتى أنني بحثت في GitHub ولكني لم أر أي شيء. استغرق البحث في المشكلات وليس نتائج العثور على C # على GitHub (التي لم يكن هناك أي منها) للعثور عليها.

شكرا لك مرة أخرى!

المرجعي:
https://github.com/dotnet/corefx/pull/28516/files

نفس المشكلة هنا. أكره أن هذا عمليا غير قابل للبحث. لا شيء في التغيير.

كيف لا يعمل هذا:

var json = JsonConvert.SerializeObject(new Version(1, 2, 3, 4));
var x = JsonConvert.DeserializeObject<Version>(json, new VersionConverter());  //CRASH

مثال بسيط جدًا عن الرجال الذين يفسدون الكود ... من فضلك أصلحه

شكرا على الرد. كان هذا هو أول ما فكرت به ، ولكن بعد ذلك لم أجد محول نوع في فئة الإصدار نفسها. جميل جدًا كيف لا توجد فئة محول نوع مباشرة على الإصدار / أي مرجع / وثائق توضح كيف ستتأثر. لم أر حتى سجل تغيير يوضح هذا السلوك الذي رأيته وهذا موجود عند تغيير التغييرات (تغيير كيفية حدوث التسلسل لنوع ما). حتى أنني بحثت في GitHub ولكني لم أر أي شيء. استغرق البحث في المشكلات وليس نتائج العثور على C # على GitHub (التي لم يكن هناك أي منها) للعثور عليها.

شكرا لك مرة أخرى!

المرجعي:
https://github.com/dotnet/corefx/pull/28516/files

لقد واجهت أيضًا الكثير من المشكلات بسبب هذا التغيير السريع. أنا مندهش من سبب عدم ذكر ذلك في سجلات التغيير.

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