プログラミング

.NETシリアライズ完全ガイド

.NETにおけるシリアライズ(Serialization)の完全ガイド

シリアライズ(Serialization)は、オブジェクトの状態を保存したり、ネットワーク越しに送信したりするために、そのオブジェクトをバイト列に変換するプロセスです。逆に、シリアライズされたデータを元のオブジェクトに戻すプロセスをデシリアライズ(Deserialization)と言います。この技術は、データの永続化やリモート通信、APIの設計において重要な役割を果たします。本記事では、.NETにおけるシリアライズの基本的な概念から、実際の使用例、そしてその注意点について完全に解説します。


シリアライズの基本概念

シリアライズの目的は、オブジェクトの状態を外部のストレージやネットワークに送信する形式(通常はバイトストリーム)に変換することです。これにより、オブジェクトのデータを一時的に保存したり、他のシステムに渡すことが可能になります。シリアライズされたデータは、後で再度デシリアライズされ、元のオブジェクトを復元することができます。

シリアライズは以下の用途で役立ちます:

  • データベースにオブジェクトを保存

  • ネットワーク越しにオブジェクトを送信

  • アプリケーション間でデータを交換

  • 様々なフォーマット(JSON、XML、バイナリなど)でデータを保存


.NETでのシリアライズの方法

.NETでは、シリアライズを行うためのいくつかの方法が用意されています。主に、次の二つのアプローチがあります:

  1. バイナリシリアライズ

  2. テキストシリアライズ(JSONやXML)

それぞれについて詳細に説明します。


1. バイナリシリアライズ

バイナリシリアライズは、オブジェクトをそのままバイト列として変換する方法です。この方法は、通常、非常に高速で効率的ですが、人間が読みやすい形式ではありません。主にアプリケーション内でのデータ転送や永続化に使用されます。

実装例:

csharp
using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializable] public class Person { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main() { Person person = new Person { Name = "Taro", Age = 30 }; // バイナリシリアライズ FileStream fs = new FileStream("person.dat", FileMode.Create); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(fs, person); fs.Close(); // デシリアライズ fs = new FileStream("person.dat", FileMode.Open); Person deserializedPerson = (Person)formatter.Deserialize(fs); fs.Close(); Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}"); } }

この例では、Personオブジェクトをバイナリ形式でシリアライズし、ファイルに保存した後、デシリアライズして元のオブジェクトを復元しています。


2. JSONシリアライズ

JSONシリアライズは、オブジェクトをJSONフォーマットに変換する方法です。JSONは、テキストベースの軽量なデータ交換フォーマットで、広く使用されています。特に、WebアプリケーションやAPIでデータを送受信する際に利用されます。

実装例:

csharp
using System; using System.IO; using System.Text.Json; public class Person { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main() { Person person = new Person { Name = "Taro", Age = 30 }; // JSONシリアライズ string jsonString = JsonSerializer.Serialize(person); File.WriteAllText("person.json", jsonString); // デシリアライズ string readJson = File.ReadAllText("person.json"); Person deserializedPerson = JsonSerializer.Deserialize(readJson); Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}"); } }

上記のコードでは、JsonSerializerを使ってPersonオブジェクトをJSON文字列としてシリアライズし、それをファイルに保存します。後でそのJSONを読み込み、デシリアライズしてオブジェクトを再生成します。


3. XMLシリアライズ

XMLシリアライズは、オブジェクトをXMLフォーマットに変換する方法です。XMLは広く使われているマークアップ言語であり、特に設定ファイルやデータ交換の際に利用されます。

実装例:

csharp
using System; using System.IO; using System.Xml.Serialization; public class Person { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main() { Person person = new Person { Name = "Taro", Age = 30 }; // XMLシリアライズ XmlSerializer serializer = new XmlSerializer(typeof(Person)); using (FileStream fs = new FileStream("person.xml", FileMode.Create)) { serializer.Serialize(fs, person); } // デシリアライズ using (FileStream fs = new FileStream("person.xml", FileMode.Open)) { Person deserializedPerson = (Person)serializer.Deserialize(fs); Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}"); } } }

このコードでは、XmlSerializerを使用してPersonオブジェクトをXMLフォーマットにシリアライズし、ファイルに保存します。その後、保存されたXMLを読み込み、デシリアライズしてオブジェクトを復元します。


シリアライズを使用する際の注意点

シリアライズにはいくつかの注意点があります。特に、セキュリティやパフォーマンスに関する考慮が重要です。

  1. セキュリティの問題
    デシリアライズを行う際に、不正なデータを処理することによるセキュリティリスクがあります。攻撃者が不正なデータを渡してくる可能性があるため、信頼できないデータのデシリアライズには十分な注意が必要です。

  2. パフォーマンスの問題
    大量のデータをシリアライズ/デシリアライズする場合、パフォーマンスに影響を与えることがあります。データを小さくするために、シリアライズの際には不要な情報を除外したり、圧縮を行うことが推奨されます。

  3. バージョン管理
    シリアライズされたデータのクラスが変更された場合(フィールドの追加や削除など)、デシリアライズ時にエラーが発生することがあります。バージョン管理や、[Serializable] 属性と併用するカスタム属性を使って、こうした問題を回避する方法もあります。


結論

.NETにおけるシリアライズは、データの保存や転送に欠かせない技術です。バイナリシリアライズ、JSONシリアライズ、XMLシリアライズといったさまざまな形式を選択することができます。それぞれの形式には、使用する場面やニーズに応じて適切な選択が求められます。シリアライズを利用する際には、セキュリティやパフォーマンスを十分に考慮することが重要です。

Back to top button