2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

シリアライズとデシリアライズ

2
Last updated at Posted at 2025-07-13

意味

「シリアライズ(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()
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?