1. Die Bedeutung der Serialisierung
Serialisierung besteht darin, Objekte in Byteströmen zu verarbeiten, um Objekte zu speichern oder in den Speicher, in die Datenbank oder in Dateien zu übertragen. Sein Hauptzweck besteht darin, den Zustand eines Objekts zu speichern, damit es bei Bedarf wiederhergestellt werden kann. Der umgekehrte Vorgang wird Deserialisierung genannt.
1.1 Funktionsweise der Serialisierung
Dieses Bild zeigt den gesamten Prozess der Serialisierung.
Objekte werden in Streams serialisiert. Streams übergeben nicht nur Daten, sondern auch Informationen über den Objekttyp, beispielsweise die Version, Kultur und den Assemblynamen des Objekts. Über diesen Stream können Objekte in einer Datenbank, Datei oder im Speicher gespeichert werden.
1.2 für die Serialisierung
Serialisierung ermöglicht Entwicklern, den Status eines Objekts zu speichern und es bei Bedarf neu zu erstellen. Dieses Objekt bietet Objektspeicher und Datenaustausch. Durch die Serialisierung können Entwickler beispielsweise Objekte über Webdienste an Remoteanwendungen senden, Objekte von einer Domäne an eine andere weitergeben, Objekte als XML-Zeichenfolgen über Firewalls hinweg oder über Anwendungen hinweg weiterleiten. Das Programm verwaltet Sicherheitsinformationen oder benutzerspezifische Informationen.
1.3 Objekte serialisierbar machen
Um ein Objekt zu serialisieren, benötigen Sie das zu serialisierende Objekt und die einzubindende Sequenz von Objekten und einen Formatierer. System.Runtime.Serialization enthält Klassen, die zum Serialisieren und Deserialisieren von Objekten erforderlich sind.
Das Anwenden des SerializableAttribute-Attributs auf einen Typ zeigt an, dass Instanzen des Typs serialisiert werden können. Wenn der Typ beim Serialisierungsversuch nicht über das SerializableAttribute-Attribut verfügt, wird eine SerializationException ausgelöst.
Wenn Sie nicht möchten, dass die Felder in Ihrer Klasse serialisierbar sind, wenden Sie das NonSerializedAttribute-Attribut an. Wenn ein Feld eines serialisierbaren Typs einen Zeiger, ein Handle oder eine andere Datenstruktur enthält, die für eine bestimmte Umgebung spezifisch ist und in einer anderen Umgebung nicht sinnvoll rekonstruiert werden kann, müssen Sie das Feld möglicherweise nicht serialisierbar machen.
Wenn die serialisierte Klasse Verweise auf Objekte anderer Klassen enthält, die mit dem SerializableAttribute gekennzeichnet sind, werden diese Objekte ebenfalls serialisiert.
1.3.1 Binäre Serialisierung und XML-Serialisierung
Sie können binäre Serialisierung oder XML-Serialisierung verwenden. Bei der binären Serialisierung werden alle Mitglieder serialisiert (auch diejenigen, die schreibgeschützt sind), was die Leistung verbessern kann. Die XML-Serialisierung bietet besser lesbaren Code und eine größere Flexibilität bei der gemeinsamen Nutzung und Verwendung von Objekten für die Interoperabilität.
1.3.2 Binäre Serialisierung
Binäre Serialisierung verwendet binäre Codierung, um eine komprimierte Serialisierung für die Speicherung oder Socket-basiertes Netzwerk-Streaming usw. zu erzeugen .
1.3.3 XML-Serialisierung
XML-Serialisierung konvertiert die öffentlichen Felder und Eigenschaften des Objekts oder die Parameter und Rückgabewerte der Methode Serialisiert in einen XML-Stream, der einem bestimmten XML Schema Definition Language (XSD)-Dokument entspricht. Die XML-Serialisierung erzeugt eine stark typisierte Klasse mit öffentlichen Eigenschaften und Feldern, die in XML konvertiert werden. System.Xml.Serialization enthält die Klassen, die zum Serialisieren und Deserialisieren von XML erforderlich sind.
Sie können Attribute auf Klassen und Klassenmitglieder anwenden, um zu steuern, wie XmlSerializer Klasseninstanzen serialisiert oder deserialisiert.
1.3.4 SOAP-Serialisierung
XML-Serialisierung kann auch verwendet werden, um Objekte in XML-Streams zu serialisieren, die der SOAP-Spezifikation entsprechen . . SOAP ist ein XML-basiertes Protokoll, das speziell für den Transport von Prozeduraufrufen mithilfe von XML entwickelt wurde. Wie bei der regulären XML-Serialisierung können Attribute zur Steuerung der von XML-Webdiensten generierten SOAP-Nachrichten im Textstil verwendet werden.
1.3.5 Grundlegende Serialisierung und benutzerdefinierte Serialisierung
Serialisierung kann auf zwei Arten durchgeführt werden: Grundlegende Serialisierung und benutzerdefinierte Serialisierung. Die grundlegende Serialisierung verwendet das .NET Framework, um Objekte automatisch zu serialisieren.
1.3.5.1 Grundlegende Serialisierung
Die einzige Voraussetzung für die grundlegende Serialisierung ist, dass das Objekt über das SerializableAttribute-Attribut verfügen muss angewandt.
NonSerializedAttribute kann verwendet werden, um die Serialisierung bestimmter Felder zu deaktivieren.
Die Versionierung von Objekten kann bei Verwendung der Basisserialisierung zu Problemen führen. In diesem Fall ist eine benutzerdefinierte Serialisierung möglicherweise besser geeignet. Die einfache Serialisierung ist die einfachste Methode zur Durchführung der Serialisierung, bietet jedoch nicht viel Kontrolle über den Prozess.
1.3.5.2 Benutzerdefinierte Serialisierung
Bei der benutzerdefinierten Serialisierung können Sie genau angeben, welche Objekte serialisiert werden und wie die Serialisierung durchgeführt wird. Klassen müssen mit SerializableAttribute gekennzeichnet sein und die ISerializable-Schnittstelle implementieren.
Wenn Sie das Objekt auch auf benutzerdefinierte Weise deserialisieren möchten, müssen Sie einen benutzerdefinierten Konstruktor verwenden.
1.3.6 Designer-Serialisierung
Die Designer-Serialisierung ist eine spezielle Form der Serialisierung, die die Art der Objektpersistenz beinhaltet, die typischerweise mit Entwicklungstools verbunden ist. Bei der Designer-Serialisierung handelt es sich um den Prozess der Konvertierung eines Objektdiagramms in eine Quelldatei, die später zum Wiederherstellen des Objektdiagramms verwendet werden kann. Quelldateien können Code, Markup und sogar SQL-Tabelleninformationen enthalten. Weitere Informationen finden Sie unter Übersicht über die Designer-Serialisierung.
2. Objektdaten durch Serialisierung speichern
Obwohl Sie die Eigenschaften eines Objekts zur Entwurfszeit auf Standardwerte festlegen können, werden alle zur Laufzeit eingegebenen Werte geändert, wenn das Objekt beschädigt ist verloren gehen. Sie können die Serialisierung verwenden, um Objektdaten zwischen Instanzen beizubehalten, sodass Werte gespeichert und abgerufen werden können, wenn das Objekt das nächste Mal instanziiert wird.
In dieser exemplarischen Vorgehensweise erstellen Sie ein einfaches Objekt und speichern die Daten des Objekts in einer Datei. Die Daten werden dann aus dieser Datei abgerufen, wenn Sie das Objekt neu erstellen. Abschließend ändern Sie den Code, um das Objekt im SOAP-Format beizubehalten.
2.1 Speichern Sie das Objekt mithilfe der Serialisierung
[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); //序列化对象到文件中 } }
Versuchen Sie nun die Deserialisierung, um zu sehen, ob es mit dem Wert des vorherigen Coupon-Objekts übereinstimmt.
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 Objekte im SOAP-Format speichern
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); //序列化 } }
Sie können SoapFormatter auch beim Deserialisieren verwenden
var deserializer = new SoapFormatter(); //Soap 格式化器 var coupon = deserializer.Deserialize(stream) as Coupon; //反序列化
[Hinweis] In diesem Beispiel werden Daten in einer Datei im Binär- oder SOAP-Format gespeichert. Diese Formate sollten nicht für sensible Daten wie Passwörter oder Kreditkarteninformationen verwendet werden.
【Hinweis】Das Binärformat ist für die meisten Windows-Anwendungen geeignet. Bei einer Webanwendung oder einem Webdienst möchten Sie das Objekt jedoch möglicherweise im SOAP-Format in einer XML-Datei speichern, um die gemeinsame Nutzung des Objekts zu vereinfachen.
Ähnlich können Objekte auch über XmlSerializer serialisiert und in XML-Dateien gespeichert werden. Wir können den geeigneten Serialisierer entsprechend unseren Anforderungen auswählen, und die Bedienung ist grundsätzlich dieselbe.
Das Obige ist der Inhalt der Serialisierung basierend auf der C#-Programmierung. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (m.sbmmt.com)!