.NETにおけるシリアライズ(Serialization)の完全ガイド
シリアライズ(Serialization)は、オブジェクトの状態を保存したり、ネットワーク越しに送信したりするために、そのオブジェクトをバイト列に変換するプロセスです。逆に、シリアライズされたデータを元のオブジェクトに戻すプロセスをデシリアライズ(Deserialization)と言います。この技術は、データの永続化やリモート通信、APIの設計において重要な役割を果たします。本記事では、.NETにおけるシリアライズの基本的な概念から、実際の使用例、そしてその注意点について完全に解説します。
シリアライズの基本概念
シリアライズの目的は、オブジェクトの状態を外部のストレージやネットワークに送信する形式(通常はバイトストリーム)に変換することです。これにより、オブジェクトのデータを一時的に保存したり、他のシステムに渡すことが可能になります。シリアライズされたデータは、後で再度デシリアライズされ、元のオブジェクトを復元することができます。
シリアライズは以下の用途で役立ちます:
-
データベースにオブジェクトを保存
-
ネットワーク越しにオブジェクトを送信
-
アプリケーション間でデータを交換
-
様々なフォーマット(JSON、XML、バイナリなど)でデータを保存
.NETでのシリアライズの方法
.NETでは、シリアライズを行うためのいくつかの方法が用意されています。主に、次の二つのアプローチがあります:
-
バイナリシリアライズ
-
テキストシリアライズ(JSONやXML)
それぞれについて詳細に説明します。
1. バイナリシリアライズ
バイナリシリアライズは、オブジェクトをそのままバイト列として変換する方法です。この方法は、通常、非常に高速で効率的ですが、人間が読みやすい形式ではありません。主にアプリケーション内でのデータ転送や永続化に使用されます。
実装例:
csharpusing 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でデータを送受信する際に利用されます。
実装例:
csharpusing 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は広く使われているマークアップ言語であり、特に設定ファイルやデータ交換の際に利用されます。
実装例:
csharpusing 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を読み込み、デシリアライズしてオブジェクトを復元します。
シリアライズを使用する際の注意点
シリアライズにはいくつかの注意点があります。特に、セキュリティやパフォーマンスに関する考慮が重要です。
-
セキュリティの問題:
デシリアライズを行う際に、不正なデータを処理することによるセキュリティリスクがあります。攻撃者が不正なデータを渡してくる可能性があるため、信頼できないデータのデシリアライズには十分な注意が必要です。 -
パフォーマンスの問題:
大量のデータをシリアライズ/デシリアライズする場合、パフォーマンスに影響を与えることがあります。データを小さくするために、シリアライズの際には不要な情報を除外したり、圧縮を行うことが推奨されます。 -
バージョン管理:
シリアライズされたデータのクラスが変更された場合(フィールドの追加や削除など)、デシリアライズ時にエラーが発生することがあります。バージョン管理や、[Serializable]属性と併用するカスタム属性を使って、こうした問題を回避する方法もあります。
結論
.NETにおけるシリアライズは、データの保存や転送に欠かせない技術です。バイナリシリアライズ、JSONシリアライズ、XMLシリアライズといったさまざまな形式を選択することができます。それぞれの形式には、使用する場面やニーズに応じて適切な選択が求められます。シリアライズを利用する際には、セキュリティやパフォーマンスを十分に考慮することが重要です。

