سؤال

لديّ عميل وتطبيق خادم يتواصل عبر .NET 2.0 عن بعد باستخدام التسلسل الثنائي.

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

إذا قمت بإعادة نشر إصدار جديد من تطبيق الخادم ، فهل سيستمر عملاؤي القدامى في العمل؟

أعتقد أنهم سيفعلون ، لأنه لم يتم حذف أي شيء من الواجهة والتنفيذ المباشر ، لكنني لست متأكدًا.

من المحتمل أن يتلخص في سؤال آخر - هل هو فرد ثنائي "ذكي بما فيه الكفاية" للتعامل مع الموقف مثل هذا من خلال تهيئة الحقول التي يفشل في العثور على بيانات في الدفق الثنائي للإدخال إلى خالية ، أم أنها ستحطم ورمي الاستثناء ؟

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

المحلول

يمكنك إضافة سمة إلى الخاصية الجديدة: OptionalField. بدون السمة ، لن يتمكن Deserializer من تحويل البيانات المسلسل إلى التعريف المحدث. السمة هي التأكد من أن Deserializer يمكنه التعامل مع البيانات "المفقودة" بأمان.

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

نصائح أخرى

أكثر من المحتمل أن يلقي استثناء ، يمكنك دائمًا تنفيذ المسلسل الخاص بك عن طريق الوراثة من ISerializable وتنفيذ الإصدار باستخدام أساليبك الخاصة GetObjectData... سيعطيك هذا درجة أكثر تشددًا من التحكم في البيانات المراد التسلسلي ... إليك مثال

using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

public class MyFooBar : ISerializable{
    private float _fVersion = 1.0;
    public MyFooBar(SerializationInfo info, StreamingContext context) {
         this._fVersion = info.GetSingle("FooBarVersionID");
         if (this._fVersion == 1.0F) bOk = this.HandleVersionOnePtZero(info, context);
         if (!bOk) throw new SerializationException(string.Format("MyFooBar: Could not handle this version {0}.", this._fVersion.ToString()));
    }
    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.LinkDemand, Flags = System.Security.Permissions.SecurityPermissionFlag.SerializationFormatter)]
   public void GetObjectData(SerializationInfo info, StreamingContext context) {
       info.AddValue("FooBarVersionID", this._fVersion);
       if (this._fVersion == 1.0F) {
          // Bool's...
          info.AddValue("FooBarBool", FooBarBool);
          // etc... for Version 1.0
       }
       if (this._fVersion == 1.1F){
          // etc... for Version 1.0
       }
   }
}

واستخدم myfoobar في هذا السياق عند التسلسل/إزالة التسلسل كما هو موضح أدناه

public bool Deserialize(string sFileName) {
            bool bSuccessful = false;
            //
            if (!System.IO.File.Exists(sFileName)) return false;
            fuBar = new MyFooBar();
            //
            try {
                using (FileStream fStream = new FileStream(sFileName, FileMode.Open)) {
                    try {
                        BinaryFormatter bf = new BinaryFormatter();
                        fuBar = (MyFooBar)bf.Deserialize(fStream);
                        bSuccessful = true;
                    } catch (System.Runtime.Serialization.SerializationException sEx) {
System.Diagnostics.Debug.WriteLine(string.Format("SERIALIZATION EXCEPTION> DETAILS ARE {0}", sEx.ToString()));
                        bSuccessful = false;
                    }
                }
            } catch (System.IO.IOException ioEx) {
                System.Diagnostics.Debug.WriteLine(string.Format("IO EXCEPTION> DETAILS ARE {0}", ioEx.ToString()));
                bSuccessful = false;
            }
            return (bSuccessful == true);
        }

هناك طريقة أكثر إبداعًا للقيام بذلك في أكثر من 2.0+ للأعلى ، لكنني أفضل بهذه الطريقة.

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