سؤال

لدي عقار يعرف بأنه:

[XmlArray("delete", IsNullable = true)]
[XmlArrayItem("contact", typeof(ContactEvent)),
 XmlArrayItem("sms", typeof(SmsEvent))]
public List<Event> Delete { get; set; }

إذا كانت القائمة<> حذف لديه العناصر

<delete />

ينبعث.إذا كانت القائمة<> حذف يتم تعيين إلى null

<delete xsi:nil="true" />

ينبعث.هل هناك طريقة باستخدام سمات للحصول على حذف العناصر غير أن تنبعث إذا جمع لا يوجد لديه العناصر ؟

جريج - مثالية شكرا, أنا لم أقرأ حتى IsNullable الوثائق افترضت أنه كان يشير إلى أنه لا يشترط.

روب كوبر - كنت أحاول تجنب ISerializable ، ولكن Gregs اقتراح يعمل.لم تصل إلى المشكلة الموضحة في (1), كسرت مجموعة من التعليمات البرمجية فقط تعود فارغة إذا جمع كان طول صفر.للالتفاف على هذا أنا خلقت EventsBuilder الدرجة (الدرجة أنا التسلسلية يسمى الأحداث) التي تدار من جميع العمر/إنشاء الكائنات الكامنة الأحداث الدرجة أن يبصق الأحداث فصول التسلسل.

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

المحلول

إذا قمت بتعيين IsNullable=false أو إزالته (فمن كاذبة بشكل افتراضي) ، ثم "حذف" عنصر لن تكون المنبعثة.هذا سوف تعمل فقط إذا جمع يساوي null.

أعتقد أن هناك خلط بين "nullability" من حيث .صافي و المتعلقة nullable عناصر XML -- تلك التي تميزت xml:النيل السمة.XmlArrayAttribute.IsNullable ضوابط الملكية الأخيرة.

نصائح أخرى

لدي نفس المشكلة حيث لم أكن أريد عنصر أنتج إذا كان الحقل فارغ أو 0.XML أنتج يمكن استخدام xsi:null="true" (حسب التصميم).

لقد قرأت في مكان ما أنه إذا قمت بتضمين خاصية من نوع bool مع نفس اسم الحقل الذي تريد التحكم ولكن المرفقة مع 'المحدد' ، XMLSerializer سوف تحقق عودة قيمة هذه الخاصية لتحديد ما إذا كان الحقل المقابل ينبغي أن تدرج.

يمكن تحقيق ذلك من دون تنفيذ IXMLSerializer:

public List<Event> Delete { get; set; }
[XMLIgnore]
public bool DeleteSpecified
{
 get
 {
   bool isRendered = false;
   if (Delete != null)
   {
     isRendered = (Delete.Count > 0);
   } 

   return isRendered;
 }
 set
 {
 }
}

أولا أود أن أقول أن تسأل نفسك "ما هو التسلسل?".

على XmlSerializer يفعل بالضبط ما يفترض أن تفعله استمرار الوضع الحالي الكائن XML.الآن أنا لست متأكدا لماذا الحالي السلوك ليس هو "الحق" لك لأن إذا كان لديك تهيئة القائمة ، ثم هو تهيئة.

أعتقد أن لديك ثلاثة خيارات:

  1. إضافة رمز إلى لفت إلى العودة فارغة إذا جمع له 0 البنود.وهذا قد تصل الفوضى رمز آخر لديك على الرغم من.
  2. تنفيذ IXmlSerializable واجهة والقيام بكل العمل بنفسك.
  3. إذا كان هذا هو عملية مشتركة ، ثم قد ترغب في النظر في سؤالي "XML التسلسل ورثت أنواع"نعم ، أنا أعلم أنه يتعامل مع قضية أخرى ، ولكن يظهر لك كيفية إنشاء عامة وسيط التسلسل الدرجة التي يمكن أن تكون "انسحب على" السماح serilization العملية أن تكون مغلفة.يمكنك إنشاء فئة مماثلة للتعامل مع تجاوز الافتراضي عملية null/صفر البند مجموعات.

آمل أن يساعد هذا.

يمكنك دائما تنفيذ IXmlSerializer وأداء التسلسل يدويا.

انظر http://www.codeproject.com/KB/cs/IXmlSerializable.aspx على سبيل المثال.

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