Sérialisation de base
Le moyen le plus simple de rendre une classe sérialisable est de la marquer avec l'attribut Serializable, comme suit.
[Serializable]
public class MyObject {
public int n1 = 0;
public int n2 = 0;
public String str = null;
}
L'exemple de code ci-dessous illustre comment une instance de cette classe peut être sérialisée dans un fichier.
MyObject obj = new MyObject();
obj.n1 = 1;
obj.n2 = 24;
obj.str = "Some String";
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
stream.Close();
Cet exemple utilise un formateur binaire pour faire la sérialisation. Tout ce que vous avez à faire est de créer une instance du flux et le formateur que vous avez l'intention d'utiliser puis d'appeler la méthode Serialize sur le formateur. Le flux et l'objet à sérialiser sont fournis comme paramètres à cet appel. Bien que ce ne soit pas explicitement illustré dans cet exemple, toutes les variables de membre d'une classe seront sérialisées, même les variables marquées comme privées. De ce point de vue, la sérialisation binaire diffère de la classe XmlSerializer qui ne sérialise que les champs publics. Pour plus d'informations sur l'exclusion des variables de membre de la sérialisation binaire, consultez Sérialisation sélective.
La réinitialisation de l'objet à son état initial est tout aussi simple. Créez d'abord un flux pour la lecture et un formatter puis ordonnez au formateur de désérialiser l'objet. L'exemple de code ci-dessous illustre cette opération.
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject) formatter.Deserialize(stream);
stream.Close();
// Here's the proof.
Console.WriteLine("n1: {0}", obj.n1);
Console.WriteLine("n2: {0}", obj.n2);
Console.WriteLine("str: {0}", obj.str);
Le formateur BinaryFormatter utilisé ci-dessus est très efficace et génère un flux d'octets compact. Tous les objets sérialisés avec ce formateur peuvent aussi être désérialisés avec lui, ce qui en fait un outil idéal pour sérialiser les objets qui seront désérialisés sur le .NET Framework. Il est important de noter que les constructeurs ne sont pas appelés lorsqu'un objet est désérialisé. Cette contrainte est placée sur la désérialisation pour des raisons de performance. Cependant, ceci viole certains des contrats habituels que le runtime fait avec le writer d'objet et les développeurs doivent s'assurer qu'ils comprennent les ramifications lorsqu'ils marquent un objet comme étant sérialisable.
Si la portabilité est une exigence, utilisez SoapFormatter à la place. Remplacez simplement BinaryFormatter dans le code ci-dessus par SoapFormatter, puis appelez Serialize et Deserialize comme précédemment. Ce formateur produit la sortie suivante pour l'exemple utilisé ci-dessus.
<SOAP-ENV:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP- ENC="https://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP- ENV="https://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle=
"https://schemas.microsoft.com/soap/encoding/clr/1.0"
"https://schemas.xmlsoap.org/soap/encoding/"
xmlns:a1="https://schemas.microsoft.com/clr/assem/ToFile">
<SOAP-ENV:Body>
<a1:MyObject id="ref-1">
<n1>1</n1>
<n2>24</n2>
<str id="ref-3">Some String</str>
</a1:MyObject>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Il est important de noter que l'attribut Serializable ne peut pas être hérité. Si vous dérivez une nouvelle classe de MyObject
, la nouvelle classe doit aussi être marquée avec l'attribut, sinon elle ne pourra pas être sérialisée. Si vous tentez, par exemple, de sérialiser une instance de la classe ci-dessous, vous obtiendrez SerializationException vous informant que le type MyStuff
n'est pas marqué comme sérialisable.
public class MyStuff : MyObject
{
public int n3;
}
L'utilisation de l'attribut Serializable est pratique, mais comporte des restrictions comme cela est illustré ci-dessus. Reportez-vous aux Indications de sérialisation pour plus d'informations sur le moment où vous devez marquer une classe pour sa sérialisation ; en effet cette dernière ne peut pas être ajoutée à une classe déjà compilée.
Voir aussi
Sérialisation binaire | Accès aux objets dans d'autres domaines d'application à l'aide de .NET Remoting | Sérialisation XML et SOAP