Erstellen Sie das serialisierbare Attribut in C#
-
Verwenden Sie die Klasse
SoapFormatter
oderSerializableAttribute
, um das serialisierbare Attribut inC#
zu erstellen -
Verwenden Sie den
BinaryFormatter
, um das serialisierbare Attribut inC#
zu erstellen -
Verwenden Sie den
XMLSerializer
, um das serialisierbare Attribut inC#
zu erstellen
In diesem Tutorial lernen Sie die drei wichtigsten Möglichkeiten kennen, die Serialisierbarkeit eines Attributs zu aktivieren, um es in C# genau zu verwenden. Die Attributserialisierung ist ein Prozess, der auf verschiedenen Schritten basiert, um ein Attribut oder Objekt aus dem Speicher in einer Folge von Bits zu speichern.
Wenn Sie eine Klasse in C# serialisieren, betrifft dies automatisch alle ihre Elemente, und nur markierte Felder von Attributen werden nicht serialisiert, was bedeutet, dass Sie eine komplexe Datenstruktur einfach speichern können, indem Sie einfach das Stammobjekt serialisieren.
Hibernate
ist ein hervorragendes modernes Architekturbeispiel für serialisierbare Attribute zum Speichern eines Objekts oder Attributs (für die Klasse serialisierbar) in Bytegrößen und zum Übertragen des Objekts auf ein anderes System, wann immer dies zur Deserialisierung erforderlich ist.
Verwenden Sie die Klasse SoapFormatter
oder SerializableAttribute
, um das serialisierbare Attribut in C#
zu erstellen
Jedes Attribut, ob öffentlich oder privat, das mit SerializableAttribute
gekennzeichnet ist, wird automatisch serialisiert, es sei denn, die Iserializable
-Schnittstelle überschreibt den Vorgang der Attributserialisierung. Um einige Attribute von der Serialisierung auszuschließen, ist das NonSerializedAttribute
äusserst hilfreich.
Die Kennzeichnung der Attribute SerializableAttribute
gilt nur bei Verwendung des SoapFormatter
oder des BinaryFormatter
und des XmlSerializer
; DataContractSerializer
und JaveScriptSerializer
unterstützen oder erkennen es nicht. Die Klasse BinaryFormatter
gehört zum Namensraum System.Runtime.Serialization.Formatters.Binary
, und die serialisierbaren Attribute verwenden Clipboard.SetData()
, um in der Zwischenablage gespeichert zu werden.
Die binäre Serialisierung von Attributen ist aufgrund ihres optimierten Speicher- und Zeitverbrauchs effizienter; Es ist jedoch nicht für Menschen lesbar. Andererseits ist die SOAP-Serialisierung nicht effizient oder optimiert, sondern macht den C#-Code lesbar.
Die XML-Serialisierung ist etwas anders, da sie XmlIgnore
anstelle von NonSerialized
verwendet und Serializable
ignoriert, da es im Namensraum System.Xml.Serialization
lebt. Es kann keine privaten Klassenmitglieder serialisieren.
// using `System.Runtime.Serialization` namespace is optional
using System;
using System.IO;
using System.Windows.Forms;
// required | essential namespace
using System.Runtime > Serialization.Formatters.Soap;
namespace serializable_attribute {
public partial class Form1 : Form {
[Serializable()]
public class test_class {
public int attribute_one;
public string attribute_two;
public string attribute_three;
public double attribute_four;
// the `attribute_five` as the fifth member is not serialized
[NonSerialized()]
public string attribute_five;
public test_class() {
attribute_one = 11;
attribute_two = "the lord of the rings";
attribute_three = "valerian steel";
attribute_four = 3.14159265;
attribute_five = "i am unserialized text!";
}
public void Print() {
// MessageBox.Show(attribute_five.ToString()); remember, object reference is NULL
string delimiter = " , ";
string messageBoxContent = String.Join(delimiter, attribute_one, attribute_two,
attribute_three, attribute_four, attribute_five);
MessageBox.Show(messageBoxContent);
}
}
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
test_class obj = new test_class();
Stream serialized_stream = File.Open(
"data.xml", FileMode.Open); // replace your `.xml` file location or let it be default
// define a new `SoapFormatter` object
SoapFormatter formatter_soap = new SoapFormatter();
// serialize the object with the stream
formatter_soap.Serialize(serialized_stream, obj);
serialized_stream.Close(); // close the stream
// obj = null; | optional
serialized_stream = File.Open("data.xml", FileMode.Open);
formatter_soap = new SoapFormatter();
// deserialize the stream w.r.t the serializable object
obj = (test_class)formatter_soap.Deserialize(serialized_stream);
// close the stream
serialized_stream.Close();
// print the serialized object
obj.Print();
}
}
}
Ausgang:
11, the lord of the rings, valerian steel, 3.14159265 ,
Am wichtigsten ist, dass die Serialisierungslaufzeit jeder serialisierbaren Klasse eine Versionsnummer zuordnet oder zuordnet (um sie nach der Überprüfung zu deserialisieren). Die Deserialisierung erfolgt nur, wenn die Versionsnummer eines serialisierbaren Attributs korrekt ist.
Ein guter Programmierer sollte die Versionsnummer immer explizit deklarieren, da sie abhängig von Compiler-Implementierungen sehr empfindlich berechnet wird und bei der Deserialisierung zu einem Fehler führen kann.
Die serialisierbaren Attribute können gespeichert oder in Dateien geschrieben werden; Wenn Sie Polymorphismus verstehen, kann dies sehr sinnvoll sein. Sie können ein Attribut serialisieren oder seinen Status speichern, indem Sie es in einen Bytestrom konvertieren, um es im Arbeitsspeicher, in einer Datenbank oder in einer Datei zu speichern.
Die Attributserialisierung ist unerlässlich, um sie vom Webserver an eine Remoteanwendung zu senden, sie von einer Domäne zu einer anderen weiterzuleiten, sie als JSON- oder XML-Zeichenfolge durch eine Firewall zu leiten oder anwendungsübergreifende Sicherheits- oder benutzerspezifische Informationen zu verwalten.
Verwenden Sie den BinaryFormatter
, um das serialisierbare Attribut in C#
zu erstellen
Der Serialisierungsprozess ist wichtig, um jede Klasse, Schnittstelle oder Struktur mit dem Serializable
-Attribut in C# auszustatten. Das Erstellen eines FileStream
-Objekts mit einem gültigen und lesbaren Namen ist wichtig, um ein Attribut zu serialisieren.
Eine Serialize()
-Methode kann mit Hilfe eines BinaryFormatter
-Objekts erstellt werden. Die Methode BinaryFormatter.Deserialize()
gibt ein Objekt zurück, das in den passenden Typ gecastet werden muss.
Um den Serialisierungsprozess von Objekten oder Attributen vollständig zu erlernen, müssen Sie den Deserialisierungsprozess verstehen.
Der Deserialisierungsprozess von serialisierbaren Attributen beginnt damit, dass die Referenz auf null
gesetzt und ein komplett neues Array von Grund auf erstellt wird, um das deserialisierte Array von Testobjekten aufzunehmen. Dies erfahren Sie in dem folgenden ausführbaren C#-Programm, und Sie lernen auch die Methoden SerializeNow()
bzw. DeSerializeNow()
kennen.
Im Allgemeinen besteht die Attributserialisierung darin, eine Instanz des serialisierten Objektspeicherorts zu erstellen, einen Stream aus dem Dateiobjekt zu erstellen, eine Instanz des BinaryFormatter
zu erstellen und schließlich die Methode Serialize()
aufzurufen.
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Windows.Forms;
namespace serializable_attribute {
public partial class Form1 : Form {
[Serializable()]
public class test_class {
public int attribute_one;
public string attribute_two;
public string attribute_three;
public double attribute_four;
// the `attribute_five` as the fifth member is not serialized
[NonSerialized()]
public string attribute_five;
public test_class() {
attribute_one = 11;
attribute_two = "the lord of the rings";
attribute_three = "valerian steel";
attribute_four = 3.14159265;
attribute_five = "i am unserialized text!";
}
public void Print() {
// MessageBox.Show(attribute_five.ToString()); remember, object reference is NULL
string delimiter = " , ";
string messageBoxContent = String.Join(delimiter, attribute_one, attribute_two,
attribute_three, attribute_four, attribute_five);
MessageBox.Show(messageBoxContent);
}
}
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
test_class obj = new test_class();
Stream serialized_stream = File.Open("data.xml", FileMode.Create);
BinaryFormatter formatter_binary = new BinaryFormatter();
formatter_binary.Serialize(serialized_stream, obj);
serialized_stream.Close();
// obj = null;
serialized_stream = File.Open("data.xml", FileMode.Open);
formatter_binary = new BinaryFormatter();
obj = (test_class)formatter_binary.Deserialize(serialized_stream);
serialized_stream.Close();
obj.Print();
}
}
}
Ausgang:
11, the lord of the rings, valerian steel, 3.14159265 ,
Klassen für Binär- oder XML-Serialisierung und -Deserialisierung gehören zum Namensraum System.Runtime.Serialization
und sind damit ein wesentlicher Teil/Bestandteil des Serialisierungsprozesses. Sowohl XML- als auch binäre Serialisierungen können unterschiedliche Vorteile bieten.
Die binäre Serialisierung von Attributen verwendet Socket-basierte Netzwerkstreams, und alle ihre Mitglieder sind schreibgeschützt, was ihre Leistung verbessern kann. Andererseits verwendet die XML-Serialisierung einen XML-Stream, der einem bestimmten XSD-Dokument (XML Schema Definition Language) entspricht, was zu stark typisierten Attributen mit öffentlichen Eigenschaften führt.
Darüber hinaus können Sie auch das SerializableAttribute
für ein serialisierbares Attribut für einen Typ verwenden, um seine Fähigkeit zur Serialisierung oder auf andere Weise anzuzeigen. Es empfiehlt sich, Attribute nicht zu serialisieren, die ein Handle, einen Zeiger oder eine andere Datenstruktur enthalten, die sich auf eine bestimmte Bedingung oder Umgebung bezieht oder damit verbunden ist.
Verwenden Sie den XMLSerializer
, um das serialisierbare Attribut in C#
zu erstellen
Es ermöglicht die Zustandspersistenz des Objekts auf der Festplatte im XML-Format. Um den XMLSerializer
in C# zu verwenden, müssen Sie die Namespaces System.Xml
und System.Xml.Serialization
importieren.
Das Objekt StreamWriter
kann die Serialisierung eines Objekts ermöglichen. Am wichtigsten ist, dass die Erstellung der Methoden Serialize()
und Deserialize()
die gleichen wie oben sind, aber anstelle des BinaryFormatter
verwenden Sie den XMLSerializer
.
Sie finden die .xml
-Datei der serialisierten Attribute im Ordner bin
oder debug
Ihres C#-Programms; Sie können den dauerhaften Zustand der Testklasse in der XML-Codierung beobachten. Die Xsd.exe
ist ein großartiges ausführbares Programm oder ein Tool, das als XML-Schema-Definitionstool funktioniert, um Klassen basierend auf dem vorhandenen XSD-Dokument (XML-Schema-Definition) zu erstellen.
using System;
using System.IO;
using System.Xml.Serialization;
using System.Windows.Forms;
namespace serializable_attribute {
[Serializable]
public class XMLSerialize {
public XMLSerialize() {}
public XMLSerialize(string rank, string sol_name) {
this._rank = rank;
this._name = sol_name;
}
public string _rank { get; set; }
public string _name { get; set; }
public override string ToString() {
return (_rank + " " + _name);
}
}
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
XMLSerialize[] ser_obj = new XMLSerialize[3];
ser_obj[0] = new XMLSerialize("Captain", "Floyyd");
ser_obj[1] = new XMLSerialize("Major", "Gerizmann");
ser_obj[2] = new XMLSerialize("Sec. Lef.", "Angel");
TextWriter obj_txtWriter = null;
obj_txtWriter = new StreamWriter("test.xml");
XmlSerializer obj_xmlSerl = new XmlSerializer(typeof(XMLSerialize[]));
obj_xmlSerl.Serialize(obj_txtWriter, ser_obj);
string delimiter = " , ";
string messageBoxContent = String.Join(delimiter, ser_obj[0], ser_obj[1], ser_obj[2]);
MessageBox.Show(messageBoxContent);
obj_txtWriter.Close();
obj_txtWriter = null;
}
}
}
Ausgang:
Captain Floyyd, Major Gerizmann, Sec. Lef. Angel
In C# kann es zwei Arten der Serialisierung von Attributen geben: einfache und benutzerdefinierte Serialisierung. Die grundlegende Serialisierung von Attributen ist einfach, da sie .NET verwendet, um die Attribute automatisch zu serialisieren, und ihre einzige Voraussetzung ist, dass auf eine Klasse das Attribut SerializableAttribute
angewendet wird.
Mit der benutzerdefinierten Serialisierung können Sie markieren, welche Objekte serialisiert werden sollen. Die Klasse muss mit SerializableAttribute
gekennzeichnet sein und die ISerializable
-Schnittstelle verwenden, und sie kann auch auf benutzerdefinierte Weise mit dem benutzerdefinierten Konstruktor deserialisiert werden.
Die Designerserialisierung von Attributen ist die seltenste Form der Attributserialisierung, die eine spezielle Attributpersistenz beinhaltet, die dem Entwicklungstool zugeordnet ist. Dabei werden Diagramme in eine Quelldatei konvertiert, um sie wiederherzustellen, und Diagramme können Markup- oder C#-Code und sogar SQL-Tabelleninformationen enthalten.
Die meisten serialisierbaren Attribute sind technische .custom
-Instanzen; das SerializableAttribute
wird jedoch einem Befehlszeilenschnittstellen-Flag .class
(serialisierbar) zugeordnet. Das System.SerializableAttribute
spezifiziert die Serialisierungsfähigkeit des Attributs.
Es ist wichtig, sich daran zu erinnern, dass es nicht notwendig ist, das NonSerializedAttribute
zu verwenden, wenn der angegebene Typ die Schnittstelle System.Runtime.Serialization.ISerializable
implementiert, was darauf hinweist, dass eine Klasse ihre eigenen Methoden der Serialisierung und Deserialisierung bereitstellt. Das kann so etwas sein:
public sealed class SerializableAttribute : Attribute {public method SerializableAttribute();}
In diesem Tutorial haben Sie alle möglichen Methoden zum Serialisieren von Attributen und zum Ändern der Serialisierung und Deserialisierung des Attributs in C# kennengelernt.
Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.
GitHub