لا يفوتني أن إلغاء تسلسل مع XmlSerializer في C # إذا لم يتم العثور على العنصر؟

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

سؤال

وأستخدمه XmlSerializer إجراء القراءة والكتابة كائن إلى XML في C #. أرى في الوقت الحاضر استخدام XmlElement الصفات وXmlIgnore لمعالجة التسلسل الكائن.

إذا ملف xml الخاص بي مفقود عنصر XML الذي أحتاج، وجوه بلدي لا يزال deserializes (XML -> الكائن) على ما يرام. كيف يمكنني تشير (ويفضل عبر سمات) أن مجال معين هو "مطلوب"؟

وهنا هو طريقة عينة من ما أستخدمه حاليا:

[XmlElement(ElementName="numberOfWidgets")]
public int NumberThatIsRequired {
    set ...;
    get ...;
}

وبلدي الحل المثالي سيكون لإضافة شيء من هذا القبيل سمة XmlRequired.

وبالإضافة إلى ذلك، هناك إشارة جيدة على ما هي سمات المتاحة لمعالجة سلوك XmlSerializer؟

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

المحلول

ولقد حصلت على الجواب للجزء الثاني: <لأ href = "http://msdn.microsoft.com/en-us/library/83y7df3e(VS.71).aspx" يختلط = "نوفولو noreferrer" > "سمات هذا التسلسل السيطرة XML" .

لا تزال تحقق في الجزء الأول ...

وتحرير: أشك بقوة لا يمكنك القيام بذلك من خلال إلغاء التسلسل XML نفسها. لقد شغلت فقط xsd.exe على مخطط عينة الذي يتضمن سمة مطلوبة - وانها بالضبط نفس الشيء إذا تم وضع علامة السمة بأنها اختياري. وإذا كانت هناك وسيلة للتتطلب خصائص ليتم تعيين، أتوقع أن يتم تنفيذها في هذه الحالة.

وأظن كنت قد حصلت أساسا لمجرد التحقق من صحة شجرة الخاص بك من الأشياء بعد deserializing ذلك. آسف لذلك ...

نصائح أخرى

والطريقة الوحيدة التي وجدتها لتحقيق ذلك هي عن طريق XSD. ما يمكنك القيام به هو التحقق من صحة أثناء إلغاء تسلسل:

static T Deserialize<T>(string xml, XmlSchemaSet schemas)
{
    //List<XmlSchemaException> exceptions = new List<XmlSchemaException>();
    ValidationEventHandler validationHandler = (s, e) =>
    {
        //you could alternatively catch all the exceptions
        //exceptions.Add(e.Exception);
        throw e.Exception;
    };

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.Schemas.Add(schemas);
    settings.ValidationType = ValidationType.Schema;
    settings.ValidationEventHandler += validationHandler;

    XmlSerializer serializer = new XmlSerializer(typeof(T));
    using (StringReader sr = new StringReader(xml))
        using (XmlReader books = XmlReader.Create(sr, settings))
           return (T)serializer.Deserialize(books);
}

لأسباب التمدد، XmlSerializer غير متسامح جدا عندما يتعلق الأمر إلغاء التسلسل. أشياء مثل [DefaultValue]، ShouldSerialize{Foo} و{Foo}Specified هي <م> أساسا استخدمت خلال التسلسل (من {Foo}Specified استثناء الراهن، وهو يحدد من خلال إلغاء التسلسل وكذلك الاستعلام خلال التسلسل).

وعلى هذا النحو؛ ليس هناك وسيلة سهلة للقيام بذلك، إلا إذا كنت تنفيذ IXmlSerializable وتفعل ذلك بنفسك. damagednoob يظهر خيار XSD، الذي هو أيضا خيار.

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