Cet article a fait l'objet d'une traduction manuelle. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte.
Traduction
Source
Ce sujet n'a pas encore été évalué - Évaluez ce sujet

ISerializable, interface

Permet à un objet de contrôler ses propres sérialisation et désérialisation.

Espace de noms :  System.Runtime.Serialization
Assembly :  mscorlib (dans mscorlib.dll)
[ComVisibleAttribute(true)]
public interface ISerializable

Le type ISerializable expose les membres suivants.

  Nom Description
Méthode publique GetObjectData Remplit SerializationInfo avec les données nécessaires pour sérialiser l'objet cible.
Début

Toute classe qui peut être sérialisée doit être marquée avec SerializableAttribute. Si une classe doit contrôler son processus de sérialisation, elle peut implémenter l'interface ISerializable. Formatter appelle GetObjectData au moment de la sérialisation et remplit le SerializationInfo fourni avec toutes les données requises pour représenter l'objet. Formatter crée SerializationInfo avec le type de l'objet dans le graphique. Les objets qui doivent envoyer des proxies pour eux-mêmes peuvent utiliser les méthodes FullTypeName et AssemblyName de SerializationInfo pour modifier les informations transmises.

En cas d'héritage de classe, il est possible de sérialiser une classe qui dérive d'une classe de base qui implémente ISerializable. Dans ce cas, la classe dérivée doit appeler l'implémentation de classe de base de GetObjectData à l'intérieur de son implémentation de GetObjectData. Sinon, les données de la classe de base ne seront pas sérialisées.

L'interface ISerializable implique un constructeur avec signature (information SerializationInfo, contexte StreamingContext). Au moment de la désérialisation, le constructeur en cours n'est appelé qu'après que les données dans SerializationInfo ont été désérialisées par le formateur. En général, ce constructeur doit être protégé si la classe n'est pas sealed.

L'ordre dans lequel les objets sont désérialisés ne peut pas être garanti. Par exemple, si un type référence un type non encore désérialisé, une exception se produit. Si vous créez des types qui ont de telles dépendances, vous pouvez contourner le problème en implémentant l'interface IDeserializationCallback et la méthode OnDeserialization.

L'architecture de sérialisation gère les types d'objets qui étendent MarshalByRefObject de la même façon que les types qui étendent Object. Ces types peuvent être marqués avec SerializableAttribute et implémentent l'interface ISerializable comme n'importe quel autre type d'objet. Leur état d'objet est capturé et rendu persistant dans le flux.

Quand ces types sont utilisés à l'aide de System.Runtime.Remoting, l'infrastructure de communication à distance fournit un substitut qui, au lieu de la sérialisation normale, sérialise un proxy pour MarshalByRefObject. Un substitut est une assistance qui sait comment sérialiser et désérialiser des objets d'un type particulier. Le proxy, invisible pour l'utilisateur dans la plupart des cas, est de type ObjRef.

Dans le modèle de design général, il serait inhabituel qu'une classe soit marquée avec l'attribut Serializable et en même temps étende MarshalByRefObject. Les développeurs doivent examiner soigneusement la sérialisation et les scénarios de communication à distance possibles quand ils combinent ces deux caractéristiques. Par exemple, cela s'appliquerait avec MemoryStream. Étant donné que la classe de base de MemoryStream (Stream) est une extension de MarshalByRefObject, il est possible de capturer l'état de MemoryStream et de le restaurer à la demande. Par conséquent, il peut être utile de sérialiser l'état de ce flux dans une base de données et de le restaurer ultérieurement. Cependant, utilisé à l'aide de la communication à distance, un proxy serait utilisé pour un objet de ce type.

Pour plus d'informations sur la sérialisation des classes qui étendent MarshalByRefObject, consultez RemotingSurrogateSelector. Pour plus d'informations sur l'implémentation de ISerializable, consultez [<topic://cpconCustomSerialization>].

Remarques à l'attention des implémenteurs

Implémentez cette interface pour permettre à un objet de participer à ses propres sérialisation et désérialisation.

L'exemple de code suivant illustre l'utilisation de l'interface ISerializable pour définir un comportement de sérialisation personnalisé pour une classe.


using System;
using System.Web;
using System.IO;
using System.Collections;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.Security.Permissions;


// There should be only one instance of this type per AppDomain.
[Serializable]
public sealed class Singleton : ISerializable 
{
    // This is the one instance of this type.
    private static readonly Singleton theOneObject = new Singleton();

    // Here are the instance fields.
    private string someString_value;
    private Int32 someNumber_value;

   public string SomeString
   {
       get{return someString_value;}
       set{someString_value = value;}
   }

   public Int32 SomeNumber
   {
       get{return someNumber_value;}
       set{someNumber_value = value;}
   }

    // Private constructor allowing this type to construct the Singleton.
    private Singleton() 
    { 
        // Do whatever is necessary to initialize the Singleton.
        someString_value = "This is a string field";
        someNumber_value = 123;
    }

    // A method returning a reference to the Singleton.
    public static Singleton GetSingleton() 
    { 
        return theOneObject; 
    }

    // A method called when serializing a Singleton.
    [SecurityPermissionAttribute(SecurityAction.LinkDemand, 
    Flags=SecurityPermissionFlag.SerializationFormatter)]
    void ISerializable.GetObjectData(
        SerializationInfo info, StreamingContext context) 
    {
        // Instead of serializing this object, 
        // serialize a SingletonSerializationHelp instead.
        info.SetType(typeof(SingletonSerializationHelper));
        // No other values need to be added.
    }

    // Note: ISerializable's special constructor is not necessary 
    // because it is never called.
}


[Serializable]
internal sealed class SingletonSerializationHelper : IObjectReference 
{
    // This object has no fields (although it could).

    // GetRealObject is called after this object is deserialized.
    public Object GetRealObject(StreamingContext context) 
    {
        // When deserialiing this object, return a reference to 
        // the Singleton object instead.
        return Singleton.GetSingleton();
    }
}


class App 
{
    [STAThread]
    static void Main() 
    {
        FileStream fs = new FileStream("DataFile.dat", FileMode.Create);

        try 
        {
            // Construct a BinaryFormatter and use it 
            // to serialize the data to the stream.
            BinaryFormatter formatter = new BinaryFormatter();

            // Create an array with multiple elements refering to 
            // the one Singleton object.
            Singleton[] a1 = { Singleton.GetSingleton(), Singleton.GetSingleton() };

            // This displays "True".
            Console.WriteLine(
                "Do both array elements refer to the same object? " + 
                (a1[0] == a1[1]));     

            // Serialize the array elements.
            formatter.Serialize(fs, a1);

            // Deserialize the array elements.
            fs.Position = 0;
            Singleton[] a2 = (Singleton[]) formatter.Deserialize(fs);

            // This displays "True".
            Console.WriteLine("Do both array elements refer to the same object? " 
                + (a2[0] == a2[1])); 

            // This displays "True".
            Console.WriteLine("Do all array elements refer to the same object? " 
                + (a1[0] == a2[0]));
        }   
        catch (SerializationException e) 
        {
            Console.WriteLine("Failed to serialize. Reason: " + e.Message);
            throw;
        }
        finally 
        {
            fs.Close();
        }
    }
}


.NET Framework

Pris en charge dans : 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Pris en charge dans : 4, 3.5 SP1

Windows 7, Windows Vista SP1 ou ultérieur, Windows XP SP3, Windows XP SP2 Édition x64, Windows Server 2008 (installation minimale non prise en charge), Windows Server 2008 R2 (installation minimale prise en charge avec SP1 ou version ultérieure), Windows Server 2003 SP2

Le .NET Framework ne prend pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.
Cela vous a-t-il été utile ?
(1500 caractères restants)
Contenu de la communauté Ajouter
Annotations FAQ