سؤال

لدي نوع بسيط ينفذ الواجهة بشكل صريح.

public interface IMessageHeader
{
    string FromAddress { get; set; }
    string ToAddress   { get; set; }
}

[Serializable]
public class MessageHeader:IMessageHeader
{
  private string from;
  private string to;

  [XmlAttribute("From")]
  string IMessageHeade.FromAddress
  {
    get { return this.from;}
    set { this.from = value;}
  }

 [XmlAttribute("To")]
 string IMessageHeade.ToAddress
 {
    get { return this.to;}
    set { this.to = value;}
 }
}

هل هناك طريقة لإجراء تسلسل وإلغاء تسلسل الكائنات من النوع IMessageHeader؟؟

لقد حصلت على الخطأ التالي عند المحاولة

"لا يمكن إجراء تسلسل للواجهة IMessageHeader"

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

المحلول

لا يمكنك إجراء تسلسل لـ IMessageHeader لأنه لا يمكنك إجراء Activator.CreateInstance(typeof(IMessageHeader)) وهو ما ستفعله عملية التسلسل تحت الأغطية.أنت بحاجة إلى نوع ملموس.

يمكنك القيام بـ typeof(MessageHeader) أو يمكنك القول، أن يكون لديك مثيل لـMessageHeader وتفعله

XmlSerializer serializer = new XmlSerializer(instance.GetType())

نصائح أخرى

لا، لأن المُسلسل يحتاج إلى فئة محددة يمكنه إنشاء مثيل لها.

نظرا للكود التالي:

XmlSerializer ser = new XmlSerializer(typeof(IMessageHeader));

IMessageHeader header = (IMessageHeader)ser.Deserialize(data);

ما الفئة التي ينشئها المُسلسِل للعودة من Deserialize()؟

من الناحية النظرية، من الممكن إجراء تسلسل/إلغاء تسلسل واجهة، ولكن ليس باستخدام XmlSerializer.

حاول إضافة IXmlSerializable إلى إعلان IMessageHeader الخاص بك، على الرغم من أنني لا أعتقد أن ذلك سينجح.

على ما أذكر، فإن برنامج تسلسل .net xml يعمل فقط مع الفئات المحددة التي تحتوي على مُنشئ افتراضي.

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

يمكن استخدام السمة XmlInclude لإخبار المُسلسل بالفئات المحددة التي تقوم بتنفيذ الواجهة.

يمكنك إنشاء فئة أساسية مجردة تنفذ IMessageHeader وترث أيضًا MarshalByRefObject

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