سؤال

[Serializable]
class MyClass
{
    [NonSerialized] int Foo { get; set; } // error
    [NonSerialized] int bar; // ok
}

لماذا هذا غير مسموح؟

أنا أعرف عن الحلول مثل

  • تنفيذ iSerializable
  • التبديل إلى XMLSerializer/XMlignore
  • التحول إلى خاصية يدويًا

السؤال على وجه التحديد لماذا هو [غير محدد] غير مسموح على المناسبة ، ولكن مسموح به في الحقول.

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

المحلول

الخصائص هي في الواقع طرق ، فهي لا يتم تسلسلها من خلال عملية التسلسل الثنائي. إنها الحقول المسلسل. لذلك من المنطقي فقط تحديد NonSerialized في مجال.

نصائح أخرى

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

لقد اعتقدت ذلك باستخدام [field:NonSerialized] ضد الممتلكات قد تعمل ، لكنها لا. لا تدعو المواصفات C# صراحة إلى قابلية التسلسل لحقل الدعم ، ولكنها تشمل هذا (10.7.3):

The following example:
 public class Point {
    public int X { get; set; } // automatically implemented
    public int Y { get; set; } // automatically implemented
}
is equivalent to the following declaration:
public class Point {
    private int x;
    private int y;
    public int X { get { return x; } set { x = value; } }
    public int Y { get { return y; } set { y = value; } }
}

وبالتالي ، فإن مجال الدعم قابل للتسلسل (الافتراضي).

قد ترغب في النظر إلى IgnoreDataMemberAttribute إذا كنت تستخدم WCF. هذا يعمل على الأدوات التلقائية.

يعمل حتى لو لم تميز جميع الأعضاء الآخرين DataMember (الذي أجده دائمًا مؤلمًا) والصف مع DataContract

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