Erstellen Sie das serialisierbare Attribut in C#

Syed Hassan Sabeeh Kazmi 15 Februar 2024
  1. Verwenden Sie die Klasse SoapFormatter oder SerializableAttribute, um das serialisierbare Attribut in C# zu erstellen
  2. Verwenden Sie den BinaryFormatter, um das serialisierbare Attribut in C# zu erstellen
  3. Verwenden Sie den XMLSerializer, um das serialisierbare Attribut in C# zu erstellen
Erstellen Sie das serialisierbare Attribut in C#

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 ,

C#-serialisierbares Attribut mit SoapFormatter oder SerializableAttribute

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 ,

C#-serialisierbares Attribut mit BinaryFormatter

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

Serialisierbares C#-Attribut mit XMLSerializer

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.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

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