Contrassegnare i tipi ISerializable con SerializableAttribute
Aggiornamento: novembre 2007
TypeName |
MarkISerializableTypesWithSerializable |
CheckId |
CA2237 |
Category |
Microsoft.Usage |
Breaking Change |
Non sostanziale |
Causa
Un tipo visibile esternamente implementa l'interfaccia System.Runtime.Serialization.ISerializable e non è contrassegnato con l'attributo System.SerializableAttribute. La regola ignora i tipi derivati il cui tipo di base non è serializzabile.
Descrizione della regola
Affinché i tipi vengano riconosciuti come serializzabili in Common Language Runtime, è necessario che siano contrassegnati con l'attributo SerializableAttribute anche se il tipo utilizza una routine di serializzazione personalizzata tramite l'implementazione dell'interfaccia ISerializable.
Correzione di violazioni
Per correggere una violazione di questa regola, applicare l'attributo SerializableAttribute al tipo.
Esclusione di avvisi
Non escludere un avviso da questa regola per le classi di eccezioni perché per funzionare correttamente in diversi domini applicazione è necessario che siano serializzabili.
Esempio
Nell'esempio riportato di seguito viene illustrato un tipo che viola la regola. Rimuovere il commento dalla riga dell'attributo SerializableAttribute per soddisfare la regola.
Imports System
Imports System.Runtime.Serialization
Imports System.Security.Permissions
Namespace UsageLibrary
' <SerializableAttribute> _
Public Class BaseType
Implements ISerializable
Dim baseValue As Integer
Sub New()
baseValue = 3
End Sub
Protected Sub New( _
info As SerializationInfo, context As StreamingContext)
baseValue = info.GetInt32("baseValue")
End Sub
<SecurityPermissionAttribute(SecurityAction.Demand, _
SerializationFormatter := True)> _
Overridable Sub GetObjectData( _
info As SerializationInfo, context As StreamingContext) _
Implements ISerializable.GetObjectData
info.AddValue("baseValue", baseValue)
End Sub
End Class
End Namespace
using System;
using System.Runtime.Serialization;
using System.Security.Permissions;
namespace UsageLibrary
{
// [SerializableAttribute]
public class BaseType : ISerializable
{
int baseValue;
public BaseType()
{
baseValue = 3;
}
protected BaseType(
SerializationInfo info, StreamingContext context)
{
baseValue = info.GetInt32("baseValue");
}
[SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
public virtual void GetObjectData(
SerializationInfo info, StreamingContext context)
{
info.AddValue("baseValue", baseValue);
}
}
}
Regole correlate
Chiamare metodi della classe base su tipi ISerializable
Implementare ISerializable in modo corretto
Implementare costruttori di serializzazione
Implementare correttamente i metodi di serializzazione
Contrassegnare tutti i campi non serializzabili