CA2235: Marcar todos los campos no serializables

Propiedad Value
Identificador de la regla CA2235
Título Marcar todos los campos no serializables
Categoría Uso
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 No

Causa

Un campo de instancia de un tipo que no es serializable se declara en un tipo que es serializable.

Descripción de la regla

Un tipo serializable es el que está marcado con el atributo System.SerializableAttribute. Cuando se serializa el tipo, se inicia una excepción System.Runtime.Serialization.SerializationException si el tipo contiene un campo de instancia de un tipo que no es serializable y no implementa la interfaz System.Runtime.Serialization.ISerializable.

Sugerencia

CA2235 no se activa para los campos de instancia de tipos que implementan ISerializable porque proporcionan su propia lógica de serialización.

Cómo corregir infracciones

Para corregir una infracción de esta regla, aplique el atributo System.NonSerializedAttribute al campo que no es serializable.

Cuándo suprimir las advertencias

Solo debe suprimir una advertencia de esta regla si se declara un tipo System.Runtime.Serialization.ISerializationSurrogate que permita la serialización y deserialización de las instancias del campo.

Supresión de una advertencia

Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.

#pragma warning disable CA2235
// The code that's violating the rule is on this line.
#pragma warning restore CA2235

Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none del archivo de configuración.

[*.{cs,vb}]
dotnet_diagnostic.CA2235.severity = none

Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.

Ejemplo

En el ejemplo siguiente se muestran dos tipos: uno que infringe la regla y otro que cumple la regla.

public class Mouse
{
    int buttons;
    string scanTypeValue;

    public int NumberOfButtons
    {
        get { return buttons; }
    }

    public string ScanType
    {
        get { return scanTypeValue; }
    }

    public Mouse(int numberOfButtons, string scanType)
    {
        buttons = numberOfButtons;
        scanTypeValue = scanType;
    }
}

[Serializable]
public class InputDevices1
{
    // Violates MarkAllNonSerializableFields.
    Mouse opticalMouse;

    public InputDevices1()
    {
        opticalMouse = new Mouse(5, "optical");
    }
}

[Serializable]
public class InputDevices2
{
    // Satisfies MarkAllNonSerializableFields.
    [NonSerialized]
    Mouse opticalMouse;

    public InputDevices2()
    {
        opticalMouse = new Mouse(5, "optical");
    }
}
Imports System
Imports System.Runtime.Serialization

Namespace ca2235

    Public Class Mouse

        ReadOnly Property NumberOfButtons As Integer

        ReadOnly Property ScanType As String

        Sub New(numberOfButtons As Integer, scanType As String)
            Me.NumberOfButtons = numberOfButtons
            Me.ScanType = scanType
        End Sub

    End Class

    <SerializableAttribute>
    Public Class InputDevices1

        ' Violates MarkAllNonSerializableFields.
        Dim opticalMouse As Mouse

        Sub New()
            opticalMouse = New Mouse(5, "optical")
        End Sub

    End Class

    <SerializableAttribute>
    Public Class InputDevices2

        ' Satisfies MarkAllNonSerializableFields.
        <NonSerializedAttribute>
        Dim opticalMouse As Mouse

        Sub New()
            opticalMouse = New Mouse(5, "optical")
        End Sub

    End Class

End Namespace

Observaciones

La regla CA2235 no analiza los tipos que implementan la interfaz ISerializable (a menos que también estén marcados con el atributo SerializableAttribute). Esto se debe a que la regla CA2237 ya recomienda tipos de marcado que implementan la interfaz ISerializable con el atributo SerializableAttribute.