意味
「シリアライズ(serialize)」と「デシリアライズ(deserialize)」は、プログラミングにおいてデータを保存・通信・再利用する際に非常に重要な概念です。それぞれを説明すると以下のようになります。
🔷 シリアライズ(Serialize)
オブジェクト → 文字列やバイナリ形式 に変換すること
✔ 使用目的の例
- ファイルに保存する
- ネットワーク越しに送信する
- キャッシュに保存する
✔ 具体例(C#)
var obj = new Person { Name = "太郎", Age = 30 };
string json = JsonSerializer.Serialize(obj); // JSON文字列に変換
このとき、obj は {"Name":"太郎","Age":30} という文字列に変換される。
🔷 デシリアライズ(Deserialize)
文字列やバイナリ形式 → オブジェクト に復元すること
✔ 使用目的の例
- 保存したデータをプログラム内で再利用
- 受信したデータを処理
✔ 具体例(C#)
string json = "{\"Name\":\"太郎\",\"Age\":30}";
var obj = JsonSerializer.Deserialize<Person>(json); // JSON文字列をPersonオブジェクトに戻す
🔷 JSONコンバーターとは?
JSONコンバーター(JsonConverter) は、主に シリアライズとデシリアライズの両方 を制御・カスタマイズするための機構で、
System.Text.Json や Newtonsoft.Json において、
-
シリアライズ(オブジェクト → JSON)
-
デシリアライズ(JSON → オブジェクト)
の 処理のルールを上書き・カスタマイズ したいときに使うクラスです。
✔ 使用目的の例
- decimal を 小数なしの整数(long)として出力したい
- 日付を "yyyy/MM/dd" フォーマットにしたい
- enum の値をカスタム文字列にしたい
✔ C# の例:Decimal を long に変換する JsonConverter
public class DecimalAsLongJsonConverter : JsonConverter<decimal>
{
public override decimal Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return (decimal)reader.GetInt64(); // JSONのlong値をdecimalとして読み取る(デシリアライズ)
}
public override void Write(Utf8JsonWriter writer, decimal value, JsonSerializerOptions options)
{
writer.WriteNumberValue((long)value); // decimalをlongとして書き出す(シリアライズ)
}
}
✔ 適用方法
var options = new JsonSerializerOptions
{
Converters = { new DecimalAsLongJsonConverter() }
};
var json = JsonSerializer.Serialize(123.45m, options); // "123"
🔁代替方法(グローバルに適用)
// もしすべての decimal 型に適用したい場合は、JsonSerializerOptions で指定します。
var options = new JsonSerializerOptions();
options.Converters.Add(new DecimalAsLongJsonConverter());
var json = JsonSerializer.Serialize(product, options);
特定のクラスやプロパティに対して、その型のシリアライズ/デシリアライズ処理をカスタマイズするためのアノテーション(属性) として使用する方法もあります。
この属性は、"指定されたクラス(DecimalAsLongJsonConverter)を使って、対象のプロパティまたは型を JSON 変換するように指示する" という意味です。
① プロパティに適用する場合:
public class Product
{
[JsonConverter(typeof(DecimalAsLongJsonConverter))]
public decimal Price { get; set; }
public string Name { get; set; }
}
// Price プロパティだけに DecimalAsLongJsonConverter が適用されます。
// 他の decimal プロパティ(例: Cost, TaxRate)には影響しません。
② 型全体に適用する場合(クラス・構造体)
[JsonConverter(typeof(DecimalAsLongJsonConverter))]
public struct MyDecimalWrapper
{
public decimal Value { get; set; }
}
// この場合、MyDecimalWrapper 型が JSON に変換されるとき、
// その全体に DecimalAsLongJsonConverter が使われます。
まとめ表
| 用語 | 処理内容 | 例 |
|---|---|---|
| シリアライズ | オブジェクト → JSONなどの文字列 | JsonSerializer.Serialize() |
| デシリアライズ | JSONなどの文字列 → オブジェクト | JsonSerializer.Deserialize() |