سؤال

لقد رأيت عددًا لا بأس به من المنشورات حول التغييرات في .NET 3.5 SP1، ولكنني عثرت على واحدة لم أر وثائقها بالأمس بعد.كان لدي تعليمات برمجية تعمل بشكل جيد على جهازي، من VS، وسطر أوامر msbuild، وكل شيء، لكنها فشلت على خادم الإنشاء (الذي يعمل بنظام .NET 3.5 RTM).

[XmlRoot("foo")]
public class Foo
{
    static void Main()
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Foo));

        string xml = @"<foo name='ack' />";
        using (StringReader sr = new StringReader(xml))
        {
            Foo foo = serializer.Deserialize(sr) as Foo;
        }
    }

    [XmlAttribute("name")]
    public string Name { get; set; }

    public Foo Bar { get; private set; }
}

في SP1، يعمل التعليمة البرمجية أعلاه بشكل جيد.في RTM، تحصل على InvalidOperationException:

غير قادر على إنشاء فئة مؤقتة (النتيجة = 1).خطأ CS0200:لا يمكن تعيين الخاصية أو المفهرس 'ConsoleApplication2.Foo.Bar' إلى - فهو للقراءة فقط

بالطبع، كل ما هو مطلوب لتشغيله ضمن RTM هو إضافة [XmlIgnore] إلى خاصية Bar.

يبدو أن Google Fu الخاص بي لا يمكنه العثور على توثيق لهذه الأنواع من التغييرات.هل توجد قائمة تغيير في أي مكان تسرد هذا التغيير (والتغييرات المشابهة تحت الغطاء والتي قد تقفز وتصرخ "مسكتك")؟هل هذا خلل أو ميزة؟

يحرر:في SP1، إذا قمت بإضافة ملف <Bar /> عنصر، أو قم بتعيين [XmlElement] لخاصية Bar، فلن يتم إلغاء تسلسله.لا يفشل في ما قبل SP1 عندما يحاول إلغاء التسلسل - فهو يطرح استثناءً عند إنشاء XmlSerializer.

هذا يجعلني أميل أكثر إلى كونه خطأ، خاصة إذا قمت بتعيين سمة [XmlElement] لـ Foo.Bar.إذا لم يكن قادرًا على تنفيذ ما أطلبه منه، فيجب عليه طرح استثناء بدلاً من تجاهل Foo.Bar بصمت.مجموعات/إعدادات أخرى غير صالحة لسمات تسلسل XML تؤدي إلى حدوث استثناء.

يحرر:شكرًا لك، TonyB، لم أكن أعلم بشأن تحديد موقع الملفات المؤقتة.بالنسبة لأولئك الذين يواجهون مشكلات مماثلة في المستقبل، فأنت بحاجة إلى علامة تكوين إضافية:

<system.diagnostics>
  <switches>
    <add name="XmlSerialization.Compilation" value="1" />
  </switches>
</system.diagnostics>
<system.xml.serialization>
  <xmlSerializer tempFilesLocation="c:\\foo"/>
</system.xml.serialization>

حتى مع تعيين سمة [XmlElement] على خاصية Bar، لم يتم ذكرها في مجموعة التسلسل التي تم إنشاؤها - والتي تضع هذا بقوة إلى حد ما في عالم الخطأ الذي يتم ابتلاعه بصمت (المعروف أيضًا باسم الخطأ).إما ذلك أو قرر المصممون أن [XmlIgnore] لم يعد ضروريًا للخصائص التي لا يمكن تعيينها - وتتوقع رؤية ذلك في ملاحظات الإصدار، تغيير القوائم, ، أو ال وثائق XmlIgnoreAttribute.

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

المحلول

في SP1 هل يتم إلغاء تسلسل الخاصية foo.Bar بشكل صحيح؟

في ما قبل SP1، لن تتمكن من إلغاء تسلسل الكائن لأن أسلوب التعيين الخاص بخاصية Bar خاص، لذا لا يكون لدى XmlSerializer طريقة لتعيين هذه القيمة.لست متأكدًا من كيفية قيام SP1 بسحبه.

يمكنك محاولة إضافة هذا إلى web.config/app.config

<system.xml.serialization> 
  <xmlSerializer tempFilesLocation="c:\\foo"/> 
</system.xml.serialization> 

سيؤدي ذلك إلى وضع الفئة التي تم إنشاؤها بواسطة XmlSerializer في c:\foo حتى تتمكن من رؤية ما يفعله في SP1 مقابل RTM

نصائح أخرى

يعجبني هذا السلوك الجديد (؟) لأن مستند XML لا يحتوي على أي ذكر للشريط، لذا لا ينبغي أن يحاول برنامج إلغاء التسلسل تعيينه.

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