Indications concernant la sérialisation
Vous devez envisager la sérialisation lors de la conception de nouvelles classes, car une classe ne peut pas être rendue sérialisable une fois qu'elle a été compilée. Il convient de se poser les questions suivantes : Est-ce que cette classe devra être envoyée dans des domaines d'application ? Est-ce que cette classe risque d'être utilisée avec la communication à distance ? Comment les utilisateurs utiliseront cette classe ? Dériveront-ils une nouvelle classe à sérialiser à partir de la vôtre ? En cas de doute, marquez la classe comme sérialisable. Il est sûrement plus judicieux de marquer toutes les classes comme sérialisables, à moins que l'un des éléments suivants soit vrai :
La classe ne peut pas changer de domaine d'application. Si la sérialisation n'est pas nécessaire et que la classe doit changer de domaine d'application, dérivez cette dernière à partir de MarshalByRefObject.
La classe stocke des pointeurs spéciaux qui sont uniquement applicables à son instance actuelle. Si une classe contient une mémoire non managée ou des handles de fichiers, par exemple, vérifiez que ces fichiers sont marqués avec l'attribut NonSerializedAttribute ou ne sérialisez pas du tout la classe.
Les données membres de classe contiennent des informations sensibles. Dans ce cas, il est recommandé de marquer la classe comme sérialisable, mais de marquer les données membres individuelles qui contiennent des informations sensibles avec l'attribut NonSerializedAttribute. Une autre possibilité consiste à implémenter l'interface ISerializable et à sérialiser uniquement les champs requis.
Tenez compte des conséquences liées à la sécurité lors du marquage d'une classe comme sérialisable. Une Link Demand ou une Inheritance Demand pour un CodeAccessPermission sur une classe ou un constructeur de classe peut être contournée par défaut ou par une sérialisation personnalisée qui implémente une demande correspondante pour le même CodeAccessPermission. (Pour plus d'informations, consultez l'énumération SecurityAction.) Si une classe dispose d'une Link Demand pour une autorisation, l'exécution contrôle uniquement l'appelant immédiat pour vérifier que l'autorisation lui a été accordée. Le code de bibliothèque de classes .NET Framework est signé avec le nom fort Microsoft et bénéficie toujours d'un niveau de confiance totale. Tout code peut utiliser un code bénéficiant d'un niveau de confiance totale pour contourner des vérifications de sécurité durant l'édition de liens. Par exemple, dans le cas de la sérialisation, un code malveillant qui ne dispose pas de l'autorisation de sérialisation requise peut appeler l'un des formateurs .NET Framework bénéficiant d'un niveau de confiance totale, tel que BinaryFormatter et contourner la vérification de demande de liaison de l'autorisation.
Voir aussi
Autres ressources
Sérialisation binaire
Remote Objects
Sérialisation XML et SOAP
Security and Serialization