متى يكون من المناسب استخدام سمة المعروفة؟

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

  •  02-10-2019
  •  | 
  •  

سؤال

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

علاوة على ذلك ، هل هناك أي عيوب لإفراط في استخدام السمة؟ على سبيل المثال ، في المثال السابق ، إذا تم وضع علامة على الفئة المسلسل مع ThinkType (baseclass) على الرغم من وجود إشارة صريحة إلى هذا النوع؟

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

المحلول

[KnownType] ضروري لإخبارها عن الأنواع الفرعية. عيب ليس استخدامه هو أن ما يلي لن يعمل:

[DataContract]
class Foo {}

[DataContract]
class Bar : Foo {}

مع طريقة على واجهة WCF التي تعود:

public Foo GetFoo() { return new Bar(); }

بدون السمة ، المسلسل (خاصة بالنسبة للأنواع التي يتم إنشاؤها بواسطة MEX/Proxy) لن أعرف Bar, ، وسوف تفشل. مع السمة:

[DataContract, KnownType(typeof(Bar))]
class Foo {}

هو - هي إرادة الشغل. هذا ينطبق فقط على DataContractSerializer - مع NetDataContractSerializer يمكنك الحصول على بيانات النوع بطريقة مختلفة.

نصائح أخرى

إذا كنت تستخدم "الميراث" XSD في مخططك.

لقد حصلت عليه للخلف. يتم تطبيق المعروفة على الفئة الأساسية ويسمي جميع الفئات المشتقة التي قد يتم تمريرها كمرجع إلى القاعدة.

على سبيل المثال:

...
KnownType(typeof(POBoxAddress))
KnownType(typeof(StreetAddress))
KnownType(typeof(SingleLineAddress))
KnownType(typeof(ParsedAddress))
public abstract class AddressBase
{
    ...
}

تكون السمة المعروفة ضرورية عندما تقوم بتسلسل أنواع غير خارقة مثل الواجهات أو الفئات الأساسية. يجب أن يعرف المسلسل WCF عن جميع التطبيقات الممكنة للواجهة أو الفئة الموروثة. أي تطبيقات لا تعرفها ستتسبب في استثناء التسلسل.

يمكن العثور على استخدام واحد يمكن العثور عليه في هذا لذلك سؤال

كما أنه مفيد لحالات مثل:

[DataContract]
[knownType(typeof(Person))]
public class KeyValue
{
  [DataMember]
  public string key {get; set;}

  [DataMember]
  public string value {get; set;}

  // rest of the code
}

الآن لنفترض أن القيمة تحتوي على بعض كائنات فئة أخرى يقول الشخص. ثم كل هذا للعمل عليك إضافة thinktype (typeof (الشخص))

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