Разница между NonSerialized и Xml.Serialization.XmlIgnore?

Мы сериализуем/десериализируем класс из XML, но есть свойства и поля в классе, которые мы хотим исключить.

Атрибуты System.NonSerialized и System.Xml.Serialization.XmlIgnore, похоже, выполняют эту работу, но какая разница между ними? Кажется, мы можем использовать XmlIgnore для любых свойств или полей класса. Но NonSerialized может использоваться только для полей. Есть ли причина не использовать XmlIgnore в каждом случае, и если да, то какая цель атрибута NonSerialized и почему разница в использовании?


Это разрешено:

<System.NonSerialized()> _
Public Foo As String

Это разрешено:

<System.Xml.Serialization.XmlIgnore()> _
Public Foo As String

Это разрешено:

<System.Xml.Serialization.XmlIgnore()> _
Public Property Bar() As String
    Get
        Return _Bar
    End Get
    Set(ByVal value As String)
        _Bar = value
    End Set
End Property

Но это не разрешено:

<System.NonSerialized()> _
Public Property Bar() As String
    Get
        Return _Bar
    End Get
    Set(ByVal value As String)
        _Bar = value
    End Set
End Property

Ответы

Ответ 1

NonSerialized применяется к большему количеству типов сериализации, чем XML. Вы бы использовали NonSerialized, если бы вы сериализовались на двоичные или SOAP и XmlIgnore, если вы строго сериализовались в XML с помощью XmlSerializer. См. Раздел замечаний класса NonSerializedAttribute в MSDN.