C# BinaryFormatter - كيف يمكنني معرفة فئة البيانات الثنائية؟

StackOverflow https://stackoverflow.com/questions/218133

  •  03-07-2019
  •  | 
  •  

سؤال

أرغب في إلغاء تسلسل كائن ولكن لا أعرف الفصل مقدمًا.لذا فكر في الكود التالي...

IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject)formatter.Deserialize(stream);

ماذا يمكنني أن أفعل إذا كنت لا أعرف الفصل مقدمًا؟لنفترض، على سبيل المثال، أن "MyFile.bin" كان MyObject أو MyFoo.كيف يمكنني تحديد الكائن المطلوب إنشاء مثيل له؟

شيء مثل...

if (magic happens here == typeof(MyObject))  
    MyObject obj = (MyObject) formatter.Deserialize(stream);   
else if (more magic happens here == typeof(MyFoo))  
    MyFoo foo = (MyFoo)formatter.Deserialize(stream);
هل كانت مفيدة؟

المحلول

ومجرد القيام به:

object result = formatter.Deserialize(stream); 
Type t = result.GetType();

نصائح أخرى

وكما يقول أساسا leppie ...

إذا كنت تريد اختبار لبضعة أنواع معروفة، يمكنك استخدام "غير" / "ب":

MyFoo foo = result As MyFoo;
if(foo != null) { // it was one of those
  // special code
}

ولكن بشكل عام، هل تدع القلق مسلسل عن مثل هذه التفاصيل ...

والأمر مختلف جدا مع serializers يستند إلى XML، بطبيعة الحال، منذ كنت في حاجة لنقول للمسلسل ما هو متوقع، بدلا من مسلسل أقول لك ما حصلت عليه.

بعض الاقتراحات،

  1. إذا قمت بإلغاء تسلسل الكائن دون إرسال الكائن myObject = formatter.Deserialize(stream);ثم استخدم عامل التشغيل "as" للتحقق من توافق النوع مع الأنواع المعروفة، ومن ثم قد ينجح ذلك.

  2. قم بإلقاء نظرة على خاصية BinaryFormatter.Binder والتي هي من النوع SerializationBinder، وقد استخدمناها من قبل لإجراء التوافق مع الإصدارات السابقة للإصدارات الأقدم من تنسيق الملف الخاص بنا وقد نجح الأمر بشكل رائع.يسمح لك بشكل أساسي بالتحكم الكامل في ما يتم إلغاء تسلسله.

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