XmlignoreAttribute ، المستخدمة فقط أثناء التسلسل ، وليس أثناء التخلص من التسلسل؟

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

سؤال

هل أنا على حق في فهم .NET xmlignoreAttribute, ، الذي يقول:

يرشد طريقة التسلسل لـ XMLSerializer بعدم تسلسلها في الحقل العام أو قيمة الممتلكات القراءة/الكتابة العامة.

الذي - التي:

  • سيتم إلحاق العقار ، إذا كان موجودًا في ملف XML؟
  • لن يتم تسلسل العقار إلى ملف XML جديد؟

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

سمح لي ذلك بترقية ملفات جديدة بصمت عن طريق قراءة الخاصية القديمة ، والتي ضبطت الخاصية الجديدة ، وعند التسلسل ، تمت إضافة الخاصية الجديدة.

ومع ذلك ، أود إزالة الخاصية القديمة من ملفات XML الجديدة ، لذلك كنت أتساءل ماذا سيحدث إذا قمت بتمييزها [XmlIgnore], ، هل ما زال ملف XML القديم يفرط بشكل صحيح وقراءة تلك الخاصية من الملف ، أم أنه سيتم تجاهله تمامًا؟

إذا لم يكن الأمر كذلك ، فهل سيفعل التغيير التالي ما أريد؟

[XmlAttribute("is-list")]
[DefaultValue(false)]
public bool IsList
{
    get { return false; }
    set {
        if (value)
            ListHandling = ListHandling.All;
    }
}

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

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

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

المحلول

إذا قمت بتمييز خاصية مع XmlIgnore, ، هو تجاهل. لا يتم النظر فيه عندما يبني XMLSerializer مجموعة التسلسل. لذلك ، لا يتم ملء خصائص XMlignore-D أثناء التخلص من التخلص ، وسيتم تركها مع قيمتها الافتراضية.

برنامج عينة (لمرجم المقتطف):

public static void RunSnippet()
{
  XmlSerializer ser = new XmlSerializer(typeof(Fie));
  Fie f = (Fie)(ser.Deserialize(new StringReader("<Fie><Bob>Hello</Bob></Fie>")));
  WL(f.Bob == null ? "null" : "something");
}

public class Fie
{
  [XmlIgnore]
  public string Bob { get; set; }
}

الإخراج من هذا البرنامج null (وإذا قمت بإزالة Xmlignore من fie.bob الإخراج something).

تحرير ردا على تحريرك: هذه ليست مجرد تفاصيل التنفيذ ؛ إنه في الواقع السلوك الموثق للسمة. من قسم الملاحظات المستندات (الفقرة الأولى): "إذا قمت بتطبيق XmlignoreAttribute على أي عضو في الفصل ، فإن XmlSerializer يتجاهل العضو عند التسلسل أو هجر مثيل للفصل. "(تم التأكيد على)

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