C# でシリアライズ可能な属性を作成する

Syed Hassan Sabeeh Kazmi 2023年10月12日
  1. C#SoapFormatter または SerializableAttribute クラスを使用してシリアライズ可能な属性を作成する
  2. C#BinaryFormatter を使用してシリアライズ可能な属性を作成する
  3. C#XMLSerializer を使用してシリアライズ可能な属性を作成する
C# でシリアライズ可能な属性を作成する

このチュートリアルでは、C# で属性を正確に使用するために、属性のシリアル化を有効にする 3つの主な方法を学習します。 属性のシリアライゼーションは、属性またはオブジェクトをメモリから一連のビットに永続化するためのさまざまな手順に基づくプロセスです。

C# でクラスをシリアル化すると、そのすべての要素に自動的に影響し、属性のマークされたフィールドのみがシリアル化されません。つまり、ルート オブジェクトをシリアル化するだけで、複雑なデータ構造を簡単に保存できます。

Hibernate は、オブジェクトまたは属性 (シリアライズ可能なクラスの場合) をバイト サイズで格納し、デシリアライズが必要な場合はいつでもオブジェクトを別のシステムに転送する、シリアライズ可能な属性の優れた現代的なアーキテクチャの例です。

C#SoapFormatter または SerializableAttribute クラスを使用してシリアライズ可能な属性を作成する

SerializableAttribute でマークされたパブリックまたはプライベートのすべての属性は、Iserializable インターフェイスが属性のシリアル化プロセスをオーバーライドしない限り、自動シリアル化されます。 シリアル化プロセスから一部の属性を除外するには、NonSerializedAttribute が非常に役立ちます。

属性 SerializableAttribute のマークは、SoapFormatter または BinaryFormatterXmlSerializer を使用する場合にのみ適用されます。 DataContractSerializerJaveScriptSerializer はそれをサポートしておらず、認識さえしていません。 BinaryFormatter クラスは System.Runtime.Serialization.Formatters.Binary 名前空間に属し、シリアル化可能な属性は Clipboard.SetData() を使用してクリップボードに保存されます。

メモリと時間の消費が最適化されているため、属性のバイナリ シリアル化はより効率的です。 ただし、人間が判読できるわけではありません。 一方、SOAP シリアル化は効率的または最適化されていませんが、C# コードを読みやすくします。

XML シリアル化は、NonSerialized の代わりに XmlIgnore を使用し、System.Xml.Serialization 名前空間に存在するため Serializable を無視するため、わずかに異なります。 プライベート クラス メンバーをシリアル化することはできません。

// 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();
    }
  }
}

出力:

11, the lord of the rings, valerian steel, 3.14159265 ,

SoapFormatter または SerializableAttribute を使用した C# のシリアライズ可能な属性

最も重要なことは、シリアライゼーション ランタイムが各シリアライズ可能なクラスまたは属性にバージョン番号を関連付けることです (検証後にデシリアライズするため)。 逆シリアル化は、シリアル化可能な属性のバージョン番号が正しい場合にのみ発生します。

優れたプログラマーは常にバージョン番号を明示的に宣言する必要があります。これは、逆シリアル化中にエラーが発生する可能性があるコンパイラの実装に依存する非常に機密性の高い計算のためです。

シリアライズ可能な属性は、ファイルに保存または書き込むことができます。 ポリモーフィズムを理解していれば、これは非常に理にかなっています。 属性をシリアライズしたり、その状態をバイト ストリームに変換してメモリ、データベース、またはファイルに保存したりできます。

属性のシリアル化は、Web サーバーによってリモート アプリケーションに送信したり、あるドメインから別のドメインに渡したり、ファイアウォールを介して JSON または XML 文字列として渡したり、アプリケーション間でセキュリティやユーザー固有の情報を維持したりするために不可欠です。

C#BinaryFormatter を使用してシリアライズ可能な属性を作成する

シリアル化プロセスは、C# で Serializable 属性を使用して各クラス、インターフェイス、または構造体を装飾するために重要です。 属性をシリアル化するには、有効で読み取り可能な名前を持つ FileStream オブジェクトを作成することが重要です。

Serialize() メソッドは、BinaryFormatter オブジェクトを使用して作成できます。 BinaryFormatter.Deserialize() メソッドは、適切な型にキャストする必要があるオブジェクトを返します。

オブジェクトまたは属性のシリアル化プロセスを完全に学習するには、逆シリアル化プロセスを理解する必要があります。

シリアル化可能な属性のシリアル化解除プロセスは、参照を null に設定し、シリアル化解除されたテスト オブジェクトの配列を格納するためにゼロからまったく新しい配列を作成することから始まります。 これは、次の実行可能な C# プログラムで学習します。また、それぞれ SerializeNow() および DeSerializeNow() メソッドも学習します。

一般に、属性のシリアル化は、シリアル化されたオブジェクトの場所のインスタンスを作成し、ファイル オブジェクトからストリームを作成し、BinaryFormatter のインスタンスを作成し、最後に Serialize() メソッドを呼び出すことで構成されます。

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();
    }
  }
}

出力:

11, the lord of the rings, valerian steel, 3.14159265 ,

BinaryFormatter を使用した C# のシリアライズ可能な属性

バイナリまたは XML のシリアル化および逆シリアル化のクラスは、System.Runtime.Serialization 名前空間に属しており、シリアル化プロセスの重要な部分/コンポーネントになっています。 XML とバイナリのシリアライゼーションには、それぞれ別の利点があります。

属性のバイナリ シリアル化では、ソケット ベースのネットワーク ストリームが使用され、そのメンバーはすべて読み取り専用であるため、パフォーマンスが向上します。 一方、XML シリアライゼーションは、特定の XML スキーマ定義言語 (XSD) ドキュメントに準拠する XML ストリームを使用するため、パブリック プロパティを持つ厳密に型指定された属性になります。

さらに、シリアル化可能な属性に SerializableAttribute を使用して、シリアル化できるかどうかを示すこともできます。 ハンドル、ポインター、または特定の条件または環境に関連または接続されたその他のデータ構造を含む属性をシリアル化しないことをお勧めします。

C#XMLSerializer を使用してシリアライズ可能な属性を作成する

これにより、オブジェクトの状態を XML 形式でディスクに永続化できます。 C# で XMLSerializer を使用するには、System.Xml および System.Xml.Serialization 名前空間をインポートする必要があります。

StreamWriter オブジェクトは、オブジェクトのシリアル化を有効にできます。 最も重要なことは、Serialize() および Deserialize() メソッドの作成は上記と同じですが、BinaryFormatter を使用する代わりに、XMLSerializer を使用することです。

シリアル化された属性の .xml ファイルは、C# プログラムの bin または debug フォルダーにあります。 テスト クラスの永続化された状態を XML エンコーディングで観察できます。 Xsd.exe は、既存の XSD (XML スキーマ定義) ドキュメントに基づいてクラスを作成するための XML スキーマ定義ツールとして機能する優れた実行可能プログラムまたはツールです。

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;
    }
  }
}

出力:

Captain Floyyd, Major Gerizmann, Sec. Lef. Angel

XMLSerializer を使用した C# のシリアライズ可能な属性

C# では、属性のシリアル化には、基本シリアル化とカスタム シリアル化の 2 種類があります。 .NET を使用して属性を自動シリアル化するため、属性の基本的なシリアル化は簡単です。唯一の要件は、クラスに SerializableAttribute 属性が適用されていることだけです。

カスタム シリアル化では、シリアル化するオブジェクトをマークできます。 クラスは SerializableAttribute とマークされ、ISerializable インターフェイスを使用する必要があります。また、カスタム コンストラクターを使用してカスタムの方法で逆シリアル化することもできます。

属性のデザイナ シリアライゼーションは、開発ツールに関連付けられた特別な属性永続性を伴う属性シリアライゼーションの最もまれな形式です。 グラフをソース ファイルに変換して復元するプロセスであり、グラフにはマークアップや C# コード、さらには SQL テーブル情報を含めることができます。

ほとんどのシリアライズ可能な属性は、技術的な .custom インスタンスです。 ただし、SerializableAttribute は、コマンド ライン インターフェイス .class フラグ (シリアル化可能) にマップされます。 System.SerializableAttribute は、シリアル化する属性の機能を指定します。

特定の型が System.Runtime.Serialization.ISerializable インターフェイスを実装している場合、NonSerializedAttribute を使用する必要がないことを覚えておくことが重要です。これは、クラスが独自のシリアル化と逆シリアル化のメソッドを提供することを示します。 これは次のようになります。

public sealed class SerializableAttribute : Attribute {public method SerializableAttribute();}

このチュートリアルでは、C# で属性をシリアル化し、属性のシリアル化と逆シリアル化を変更するあらゆる方法を学習しました。

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