هل من الممكن إجراء تسلسل للكائنات بدون مُنشئ بدون معلمات في WCF؟
-
03-07-2019 - |
سؤال
أعلم أن مُنشئًا خاصًا بدون معلمات يعمل ولكن ماذا عن كائن لا يحتوي على مُنشئات بدون معلمات؟
أرغب في الكشف عن الأنواع من مكتبة تابعة لجهة خارجية حتى لا أتمكن من التحكم في تعريفات الأنواع.
إذا كان هناك طريقة ما هو أسهل؟على سبيل المثالليس لدي ما يجب أن أقوم به لإنشاء نوع فرعي.
يحرر:
ما أبحث عنه هو شيء مثل مستوى التخصيص الموضح هنا: http://msdn.microsoft.com/en-us/magazine/cc163902.aspxعلى الرغم من أنني لا أرغب في اللجوء إلى التدفقات لإجراء تسلسل/إلغاء تسلسل.
المحلول
لا يمكنك حقًا جعل الأنواع العشوائية قابلة للتسلسل؛في بعض الحالات (XmlSerializer
, ، على سبيل المثال) يعرض وقت التشغيل خيارات لانتحال السمات.لكن DataContractSerializer
لا يسمح بهذا.الخيارات الممكنة:
- إخفاء الطبقات وراء الأنواع الخاصة بك نكون قابل للتسلسل (الكثير من العمل)
- توفير بدائل المنسق الثنائي (yeuch)
- اكتب جوهر التسلسل الخاص بك (هناك الكثير من العمل لتحقيقه بشكل صحيح)
في الأساس، إذا لم يكن هناك شيء مصممة للتسلسل، القليل جدا من الإطار سوف يترك قمت بتسلسلها.
نصائح أخرى
أنا لست خبيرًا في WCF ولكن من غير المرجح أن يدعموا التسلسل على مُنشئ بأنواع عشوائية.أي لأنه ما الذي سيمررونه للقيم؟يمكنك تمرير قيمة فارغة للأنواع المرجعية وقيم فارغة للبنيات.ولكن ما فائدة النوع الذي يمكن إنشاؤه باستخدام بيانات فارغة تمامًا؟
أعتقد أنك عالق مع واحد من خيارين
- فئة فرعية للنوع المعني وتمرير القيم الافتراضية المناسبة إلى المنشئ بدون معلمات
- قم بإنشاء نوع موجود فقط للتسلسل.بمجرد الانتهاء، يمكن إنشاء مثيل من النوع الأصلي الذي تهتم به.إنه جسر من نوع ما.
أنا شخصياً سأختار رقم 2.اجعل الفصل عبارة عن بنية بيانات فقط وقم بتحسينه لأغراض التسلسل والمصنع.
وجريت اختبار قليلا، وذلك باستخدام خدمة WCF التي تقوم بإرجاع كائن أساسي ليس لديها منشئ افتراضي.
//[DataContract]
//[Serializable]
public class MyObject
{
public MyObject(string _name)
{
Name = _name;
}
//[DataMember]
public string Name { get; set; }
//[DataMember]
public string Address { get; set; }
}
وهنا هو ما يبدو من الخدمات مثل:
public class MyService : IMyService
{
#region IMyService Members
public MyObject GetByName(string _name)
{
return new MyObject(_name) { Address = "Test Address" };
}
#endregion
}
وهذا في الواقع يعمل، ما دام MyObject إما [DataContract] أو [تسلسل]. ومن المثير للاهتمام، فإنه لا يبدو في حاجة المنشئ الافتراضي على جانب العميل. هناك وظيفة ذات الصلة هنا: