1. シリアル化の意味
シリアル化とは、オブジェクトをバイト ストリームに処理して、オブジェクトを保存したり、メモリ、データベース、ファイルに転送したりすることです。その主な目的は、オブジェクトの状態を保存して、必要なときに再作成できるようにすることです。逆のプロセスはデシリアライズと呼ばれます。
1.1 シリアル化の仕組み
この図はシリアル化のプロセス全体を示しています。
オブジェクトはストリームにシリアル化されます。ストリームはデータだけでなく、オブジェクトのバージョン、カルチャ、アセンブリ名などのオブジェクトの種類に関する情報も渡します。このストリームを通じて、オブジェクトをデータベース、ファイル、またはメモリに保存できます。
1.2 (シリアル化用)
シリアル化を通じて、開発者はオブジェクトの状態を保存し、必要に応じて再作成できるため、オブジェクトのストレージとデータ交換が提供されます。シリアル化により、開発者は、Web サービスを介してリモート アプリケーションにオブジェクトを送信したり、あるドメインから別のドメインにオブジェクトを渡したり、ファイアウォールやアプリケーション間でオブジェクトを XML 文字列として渡したりすることもできます。プログラムはセキュリティ情報やユーザー固有の情報を維持します。
1.3 オブジェクトをシリアル化可能にする
オブジェクトをシリアル化するには、シリアル化するオブジェクト、シリアル化されたオブジェクトを含むストリーム、およびフォーマッタが必要です。 System.Runtime.Serialization には、オブジェクトのシリアル化と逆シリアル化に必要なクラスが含まれています。
SerializableAttribute 属性を型に適用すると、その型のインスタンスをシリアル化できることを示します。シリアル化しようとするときに、型に SerializableAttribute 属性がない場合は、SerializationException がスローされます。
クラス内のフィールドをシリアル化可能にしたくない場合は、NonSerializedAttribute 属性を適用します。シリアル化可能な型のフィールドに、特定の環境に固有のポインター、ハンドル、またはその他のデータ構造が含まれており、別の環境では意味のある方法で再構築できない場合は、フィールドをシリアル化不可にすることが必要な場合があります。
シリアル化されたクラスに SerializableAttribute でマークされた他のクラスのオブジェクトへの参照が含まれている場合、これらのオブジェクトもシリアル化されます。
1.3.1 バイナリシリアル化とXMLシリアル化
バイナリシリアル化またはXMLシリアル化を使用できます。バイナリ シリアル化では、すべてのメンバー (読み取り専用のメンバーも含む) がシリアル化されるため、パフォーマンスが向上します。 XML シリアル化により、コードがより読みやすくなり、オブジェクトの共有と相互運用性のための使用における柔軟性が向上します。
1.3.2 バイナリ シリアル化
バイナリ シリアル化は、バイナリ エンコーディングを使用して、ストレージまたはソケットベースのネットワーク ストリームなどの合理化されたシリアル化を生成します。
1.3.3 XML シリアル化
XML シリアル化は、オブジェクトのパブリック フィールドとプロパティ、またはメソッドのパラメーターと戻り値を、特定の XML スキーマ定義言語 ( XSD) ドキュメント。 XML シリアル化では、XML に変換されるパブリック プロパティとフィールドを持つ厳密に型指定されたクラスが生成されます。 System.Xml.Serialization には、XML をシリアル化および逆シリアル化するために必要なクラスが含まれています。
クラスおよびクラス メンバーに属性を適用して、XmlSerializer がクラス インスタンスをシリアル化または逆シリアル化する方法を制御できます。
1.3.4 SOAP シリアル化
XML シリアル化は、オブジェクトを SOAP 仕様に準拠した XML ストリームにシリアル化するために使用することもできます。 SOAP は、XML を使用してプロシージャ呼び出しを転送するために特別に設計された XML ベースのプロトコルです。通常の XML シリアル化と同様に、属性を使用して、XML Web サービスによって生成されるテキスト スタイルの SOAP メッセージを制御できます。
1.3.5 基本シリアル化とカスタムシリアル化
シリアル化は、基本シリアル化とカスタムシリアル化の 2 つの方法で実行できます。基本的なシリアル化では、.NET Framework を使用してオブジェクトを自動的にシリアル化します。
1.3.5.1 基本的なシリアル化
基本的なシリアル化の唯一の要件は、オブジェクトに SerializableAttribute 属性が適用されている必要があることです。
NonSerializedAttribute を使用して、特定のフィールドのシリアル化を無効にすることができます。
基本的なシリアル化を使用する場合、オブジェクトのバージョン管理により問題が発生する可能性があります。その場合、カスタム シリアル化の方が適切である可能性があります。基本的なシリアル化はシリアル化を実行する最も簡単な方法ですが、プロセスをあまり制御できません。
1.3.5.2 カスタムシリアル化
カスタムシリアル化では、どのオブジェクトがシリアル化されるか、およびシリアル化がどのように実行されるかを正確に指定できます。クラスは SerializableAttribute でマークされ、ISerializable インターフェイスを実装する必要があります。
カスタムの方法でもオブジェクトを逆シリアル化する場合は、カスタム コンストラクターを使用する必要があります。
1.3.6 デザイナーのシリアル化
デザイナーのシリアル化は、開発ツールに通常関連付けられるオブジェクトの永続化の種類を含む特殊な形式のシリアル化です。デザイナーのシリアル化は、オブジェクト グラフを後でオブジェクト グラフの復元に使用できるソース ファイルに変換するプロセスです。ソース ファイルには、コード、マークアップ、さらには SQL テーブル情報も含めることができます。詳細については、「デザイナー シリアル化の概要」を参照してください。
2. シリアル化を通じてオブジェクト データを保存する
設計時にオブジェクトのプロパティをデフォルト値に設定できますが、オブジェクトが破損すると、実行時に入力されたすべての値が失われます。 シリアル化を使用すると、インスタンス間でオブジェクト データを永続化し、次回オブジェクトがインスタンス化されるときに値を保存および取得できるようになります。
このチュートリアルでは、単純なオブジェクトを作成し、そのオブジェクトのデータをファイルに保存します。オブジェクトを再作成するときに、このファイルからデータが取得されます。最後に、SOAP 形式を使用してオブジェクトを永続化するようにコードを変更します。
2.1 シリアル化を使用してオブジェクトを保存します
[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); //序列化对象到文件中 } }
次に、逆シリアル化して、前のクーポンオブジェクトの値と一致するかどうかを確認してください。
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 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を使用する
var deserializer = new SoapFormatter(); //Soap 格式化器 var coupon = deserializer.Deserialize(stream) as Coupon; //反序列化
【注意】この例ではバイナリ形式またはSOAP形式のファイルにデータを格納します。これらの形式は、パスワードやクレジット カード情報などの機密データには使用しないでください。
【注意】バイナリ形式は、ほとんどの Windows アプリケーションに適しています。ただし、Web アプリケーションまたは Web サービスの場合は、オブジェクトを共有しやすくするために、SOAP 形式を使用してオブジェクトを XML ファイルに保存することができます。
同様に、XmlSerializer を通じてオブジェクトをシリアル化し、XML ファイルに保存することもできます。ニーズに応じて適切なシリアライザーを選択でき、操作は基本的に同じです。
上記はC#プログラミングをベースにした連載の内容です。その他の関連コンテンツについては、PHP中国語Webサイト(www.php.cn)をご覧ください。