Maison > Article > développement back-end > Sérialisation des bases de la programmation C#
1. La signification de la sérialisation
La sérialisation consiste à traiter des objets en flux d'octets pour stocker des objets ou les transférer vers la mémoire, une base de données ou des fichiers. Son objectif principal est de sauvegarder l'état d'un objet afin de pouvoir le recréer en cas de besoin. Le processus inverse est appelé désérialisation.
1.1 Comment fonctionne la sérialisation
Cette image montre l'ensemble du processus de sérialisation.
les objets sont sérialisés en flux. Les flux transmettent non seulement des données, mais également des informations sur le type d'objet, telles que la version, la culture et le nom de l'assembly de l'objet. Grâce à ce flux, les objets peuvent être stockés dans une base de données, un fichier ou en mémoire.
1.2 pour la sérialisation
La sérialisation permet aux développeurs de sauvegarder l'état d'un objet et de le recréer en cas de besoin Cet objet fournit un stockage d'objets et l'échange de données. La sérialisation permet également aux développeurs d'envoyer des objets à des applications distantes via des services Web, de transmettre des objets d'un domaine à un autre, de transmettre des objets sous forme de chaînes XML à travers des pare-feu ou entre des applications. Le programme conserve des informations de sécurité ou des informations spécifiques à l'utilisateur.
1.3 Rendre des objets sérialisables
Pour sérialiser un objet, vous avez besoin que l'objet soit sérialisé, la séquence à inclure Stream d'objets et un formateur. System.Runtime.Serialization contient les classes requises pour sérialiser et désérialiser les objets.
L'application de l'attribut SerializingAttribute à un type indique que les instances du type peuvent être sérialisées. Lors de la tentative de sérialisation, si le type n'a pas l'attribut SerializingAttribute, une SerializationException sera levée.
Si vous ne souhaitez pas que les champs de votre classe soient sérialisables, appliquez l'attribut NonSerializedAttribute. Si un champ de type sérialisable contient un pointeur, un handle ou une autre structure de données spécifique à un environnement particulier et ne peut pas être reconstruit de manière significative dans un environnement différent, vous devrez peut-être rendre le champ non sérialisable.
Si la classe sérialisée contient des références à des objets d'autres classes marquées avec SeriallesslyAttribute, ces objets seront également sérialisés.
1.3.1 Sérialisation binaire et sérialisation XML
Vous pouvez utiliser la sérialisation binaire ou la sérialisation XML. Dans la sérialisation binaire, tous les membres sont sérialisés (même ceux en lecture seule), ce qui peut améliorer les performances. La sérialisation XML fournit un code plus lisible et une plus grande flexibilité dans le partage d'objets et leur utilisation pour l'interopérabilité.
1.3.2 Sérialisation binaire
La sérialisation binaire utilise un codage binaire pour générer une sérialisation condensée pour le stockage ou le streaming réseau basé sur une socket, etc. .
1.3.3 Sérialisation XML
La sérialisation XML convertit les champs et propriétés publics de l'objet ou les paramètres et valeurs de retour de la méthode sérialisée dans un flux XML conforme à un document XML Schema Definition Language (XSD) spécifique. La sérialisation XML produit une classe fortement typée avec des propriétés publiques et des champs convertis en XML. System.Xml.Serialization contient les classes requises pour sérialiser et désérialiser XML.
Vous pouvez appliquer des attributs aux classes et aux membres de la classe pour contrôler la manière dont XmlSerializer sérialise ou désérialise les instances de classe.
1.3.4 Sérialisation SOAP
La sérialisation XML peut également être utilisée pour sérialiser des objets dans des flux XML conformes à la spécification SOAP . SOAP est un protocole basé sur XML conçu spécifiquement pour transporter des appels de procédure à l'aide de XML. Comme pour la sérialisation XML classique, les attributs peuvent être utilisés pour contrôler les messages SOAP de style texte générés par les services Web XML.
1.3.5 Sérialisation de base et sérialisation personnalisée
La sérialisation peut être effectuée de deux manières : la sérialisation de base et la sérialisation personnalisée. La sérialisation de base utilise le .NET Framework pour sérialiser automatiquement les objets.
1.3.5.1 Sérialisation de base
La seule exigence pour la sérialisation de base est que l'objet doit avoir l'attribut SerializingAttribute appliqué.
NonSerializedAttribute peut être utilisé pour désactiver la sérialisation de champs spécifiques.
La gestion des versions des objets peut entraîner des problèmes lors de l'utilisation de la sérialisation de base, auquel cas la sérialisation personnalisée peut être plus appropriée. La sérialisation de base est le moyen le plus simple d'effectuer la sérialisation, mais elle n'offre pas beaucoup de contrôle sur le processus.
1.3.5.2 Sérialisation personnalisée
Dans la sérialisation personnalisée, vous pouvez spécifier exactement quels objets seront sérialisés et comment la sérialisation est effectuée. Les classes doivent être marquées avec SerialisedAttribute et implémenter l'interface ISerializing.
Si vous souhaitez également désérialiser l'objet de manière personnalisée, vous devez utiliser un constructeur personnalisé.
1.3.6 Sérialisation du concepteur
La sérialisation du concepteur est une forme spéciale de sérialisation qui implique le type de persistance d'objet généralement associé aux outils de développement. La sérialisation du concepteur est le processus de conversion d'un graphique d'objets en un fichier source qui peut ensuite être utilisé pour restaurer le graphique d'objets. Les fichiers source peuvent contenir du code, du balisage et même des informations sur les tables SQL. Pour plus d’informations, consultez Présentation de la sérialisation du concepteur.
2. Enregistrez les données de l'objet via la sérialisation
Bien que vous puissiez définir les propriétés d'un objet sur les valeurs par défaut au moment de la conception, si l'objet est endommagé, toutes les valeurs saisies au moment de l'exécution le seront. être perdu. Vous pouvez utiliser la sérialisation pour conserver les données d'objet entre les instances, permettant ainsi de stocker et de récupérer les valeurs la prochaine fois que l'objet est instancié.
Dans cette procédure pas à pas, vous allez créer un objet simple et enregistrer les données de l'objet dans un fichier. Les données seront ensuite récupérées de ce fichier lorsque vous recréerez l'objet. Enfin, vous modifierez le code pour rendre l'objet persistant au format SOAP.
2.1 Enregistrez l'objet en utilisant la sérialisation
[Serializable] //将类标记为可序列化 public class Coupon : INotifyPropertyChanged { public decimal Amount { get; set; } public float InterestRate { get; set; } public int Term { get; set; } private string _name; public string Name { get { return _name; } set { _name = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Customer")); } } [field: NonSerialized()] //将可序列化的类中的某字段标记为不被序列化 public event PropertyChangedEventHandler PropertyChanged; public Coupon(decimal amount, float interestRate, int term, string name) { Amount = amount; InterestRate = interestRate; Term = term; _name = name; } } static void Main(string[] args) { const string fileName = @"demo1.txt"; var coupon = new Coupon(10000, 0.2f, 1, "反骨仔"); using (var stream = File.Create(fileName)) { var deserializer = new BinaryFormatter(); //二进制格式序列化器 deserializer.Serialize(stream, coupon); //序列化对象到文件中 } }
Essayez maintenant la désérialisation pour voir si elle est cohérente avec la valeur de l'objet Coupon précédent.
static void Main(string[] args) { const string fileName = @"demo1.txt"; //var coupon = new Coupon(10000, 0.2f, 1, "反骨仔"); //判断该文件是否存在 if (!File.Exists(fileName)) { return; } using (var stream = File.OpenRead(fileName)) { var deserializer = new BinaryFormatter(); //二进制序列化器 var coupon = deserializer.Deserialize(stream) as Coupon; //反序列化 if (coupon == null) { return; } Console.WriteLine($"{nameof(Coupon)}:"); Console.WriteLine($" {nameof(coupon.Amount)}: {coupon.Amount}"); Console.WriteLine($" {nameof(coupon.InterestRate)}: {coupon.InterestRate}%"); Console.WriteLine($" {nameof(coupon.Term)}: {coupon.Term}"); Console.WriteLine($" {nameof(coupon.Name)}: {coupon.Name}"); } Console.Read(); }
2.2 Enregistrer les objets au format SOAP
static void Main(string[] args) { const string fileName = @"demo1.txt"; var coupon = new Coupon(10000, 0.2f, 1, "反骨仔"); using (var stream = File.Create(fileName)) { var deserializer = new SoapFormatter(); //Soap 格式化器 deserializer.Serialize(stream, coupon); //序列化 } }
SoapFormatter peut également être utilisé lors de la désérialisation
var deserializer = new SoapFormatter(); //Soap 格式化器 var coupon = deserializer.Deserialize(stream) as Coupon; //反序列化
[Note] Cet exemple stocke les données dans un fichier au format binaire ou SOAP. Ces formats ne doivent pas être utilisés pour des données sensibles telles que des mots de passe ou des informations de carte de crédit.
【Remarque】Le format binaire convient à la plupart des applications Windows. Mais pour une application Web ou un service Web, vous souhaiterez peut-être enregistrer l'objet dans un fichier XML au format SOAP pour faciliter le partage de l'objet.
De même, les objets peuvent également être sérialisés et enregistrés dans des fichiers XML via XmlSerializer. Nous pouvons choisir le sérialiseur approprié en fonction de nos besoins, et le fonctionnement est fondamentalement le même.
Ce qui précède est le contenu de la sérialisation basée sur la programmation C#. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !