منع تسلسل XML لـ IEnumerable وICollection<T> والأنواع الموروثة

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

سؤال

ملحوظة: XMLتجاهل ليس الجواب!

حسنًا ، متابعة لسؤالي فصاعدًا تسلسل XML والأنواع الموروثة, ، لقد بدأت في دمج هذا الرمز في تطبيقي الذي أعمل عليه، معتقدًا بغباء أن كل شيء سيكون على ما يرام..

لقد واجهت مشاكل مع اثنين من الفصول الدراسية التي قمت بتنفيذها لا يحصى و مجموعة <T>

المشكلة في هذه هي أنه عندما يأتي XMLSerializer لإجراء تسلسل لها، فإنه ينظر إليها كخاصية خارجية، وبدلاً من استخدام الخاصية التي نرغب في ذلك (أي.واحد مع لدينا AbstractXmlSerializer ) يأتي هنا ويسقط (بسبب عدم تطابق النوع)، مما يعيدنا إلى المربع الأول.لا يمكنك تزيين هذه الطرق باستخدام XmlIgnore السمة إما، لذلك لا يمكننا إيقافها بهذه الطريقة.

الحل الحالي الذي أقترحه هو إزالة تطبيق الواجهة (في هذا التطبيق الحالي، لا يمثل هذا مشكلة كبيرة، فقط جعل الكود أجمل).

هل أحتاج إلى ابتلاع كبريائي بهذا الأمر وأقبل أنه لا يمكن القيام به؟ أعلم أنني دفعت نوعًا ما واستفدت من XmlSerializer أكثر مما كان متوقعًا منه :)


يحرر

وأود أن أضيف أيضًا أنني أعمل حاليًا في الإطار 2.


تحديث

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

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

المحلول

يمكنك التغلب على هذه المشكلة عن طريق الحصول على ملف System.RunTime.Serialization dll (وهو عبارة عن تجميع .net 3.x) والإشارة إليه من تطبيق .net 2.0 الخاص بك.يعمل هذا لأنه تم تجميع ثنائيات .net 3.0 للتشغيل على .net 2.0 CLR.

من خلال القيام بذلك، يمكنك الوصول إلى DataContractSerliazer الذي استخدمته للتغلب على مشكلة مماثلة حيث أردت تمرير ICollection كمعلمة إلى خدمة ويب ولم يعرف xmlserializer كيفية التعامل معها بشكل صحيح.

إذا كنت لا ترغب في استخدام .net 3.x dll في تطبيق 2.x الخاص بك، فيجب أن تكون قادرًا على استخدام DataContractSerializer لحل هذه المشكلة

نصائح أخرى

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

أفترض أنه يمكنك تنفيذ IXmlSerializable لنوع IEnumerable للتغلب على هذا السلوك.ومع ذلك، هذا يعني أنه يجب عليك التحكم بشكل كامل في عملية التسلسل لهذا النوع.طريقة بسيطة لعدم الاضطرار إلى العبث بـ XmlReader / XmlWriter، يمكنك كتابة فئة محول xml مساعد باستخدام ctor العام وخصائص القراءة والكتابة العامة لجميع البيانات المراد تسلسلها، وإنشاء كائن XmlSerializer مؤقت لهذا النوع بالداخل IXmlSerializable.[قراءة|كتابة]Xml().

class Target : IEnumerable<Anything>, IXmlSerializable
{
//...

public void ReadXml(System.Xml.XmlReader reader)
{
    reader.ReadStartElement();
    TargetXmlAdapter toRead = (TargetXmlAdapter)new XmlSerializer(typeof(TargetXmlAdapter)).Deserialize(reader);
    reader.Read();

    // here: install state from TargetXmlAdapter
}

public void WriteXml(System.Xml.XmlWriter writer)
{
    // NOTE: TargetXmlAdapter(Target) is supposed to store this' state being subject to serialization
    new XmlSerializer(typeof(TargetXmlAdapter)).Serialize(writer, new TargetXmlAdapter(this));
}
}

إذا كنت تستخدم هذه السمات:

        [XmlArray("ProviderPatientLists")]
        [XmlArrayItem("File")]
      public ProviderPatientList Files
    {
        get { return _ProviderPatientLists; }
        set
        {
            _ProviderPatientLists = value;
        }
    }

حيث يرث ProviderPatientList List<PatientList>

يمكنك بعد ذلك الحصول على مزيد من التحكم في إخراج XML الذي سيتم إنشاؤه

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