سؤال

لدي بيانات تم تخزينها باستخدام التسلسل الثنائي للفئة التالية:

[Serializable]
public abstract class BaseBusinessObject
{
    private NameValueCollection _fieldErrors = new NameValueCollection();

    protected virtual NameValueCollection FieldErrors
    {
        get { return _fieldErrors; }
        set { _fieldErrors = value; }
    }

    ...
}

في مرحلة ما، تم تغيير الفصل إلى هذا:

[Serializable]
public abstract class BaseBusinessObject
{
    private Dictionary<string, string> _fieldErrors = new Dictionary<string, string>();

    protected virtual Dictionary<string, string> FieldErrors
    {
        get { return _fieldErrors; }
        set { _fieldErrors = value; }
    }

    ...
}

هذا يسبب مشاكل تحيز البيانات القديمة.

كان من الفكر الأول هو تنفيذ ISerializable, ، ولكن هذه الفئة لديها العديد من الخصائص وكذلك مئات من دروس الميراث التي يجب أن أقوم بتطبيق هذا أيضا.

أرغب في تغيير البيانات القديمة لتتناسب مع الهيكل الحالي أثناء التحيز أو أن يكون لديك طريقة نظيفة لرفع البيانات القديمة.

هل كانت مفيدة؟

المحلول

أضف الجديدfieldErrors تحت اسم مختلف، قل _fieldErrors2, وجعلها [Optional]. وبعد ثم تنفيذ an. [OnDeserialized] الطريقة التي تنسخ البيانات من _fieldErrors ل _fieldErrors2 (إذا كان موجودا)، ويملا _fieldrors.

نصائح أخرى

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

حتى لو لم يتم استخدامها داخليا فقط، يبدو أن المستورد يشبه أبسط طريقة للذهاب.

إضافة إلى نصيحة OLIVIERD جيدة، أقترح عليك تحديد كلا الفئتين ولكن في البداية حاول التحمل كإصدار الحالي. في كتلة الصيد الخاصة بك، تحيزه كإصدار إرث، ثم قم بترقيةه إلى واحد وحفظه مرة أخرى. عندما لا توجد مثيلات من النسخة القديمة، يمكنك إزالة الرمز.

بعد التحقيق في بعض الخيارات، قمت بإجراء الاستنتاجات التالية:

من الناحية المثالية، سأكون قادرا على الوصول إلى القيمة من الأصل NameValueCollection وتحويله يدويا إلى Dictionary<string, string>. وبعد الطريقة الوحيدة للقيام بذلك سيكون تنفيذ ISerializable, ، ولكن هذا يطرح مشكلتين رئيسيين: مطابقة تصل إلى تسمية البيانات القديمة وإدراج منطق التسلسل لجميع فئات الميراث (منها المئات).

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top