C# PR

【C#】データやオブジェクトをシリアライズする主な方法3選

アイキャッチ(c_sharp)
記事内に商品プロモーションを含む場合があります

こんにちは!
今日はC#でのデータやオブジェクトのシリアライズについて一緒に学んでいきましょう。
シリアライズって何?と思われるかもしれませんが、これはオブジェクトの状態を保存できる形式に変換するプロセスのことを指します。
言い換えれば、私たちが作ったオブジェクトを、後でまた使えるように記録しておく方法です。

特に、アプリケーションでデータを保存したり、ネットワークを介してデータをやり取りしたりするときに、シリアライズはとても役立ちます。
今回は、そんなシリアライズの世界における、C#でよく使われる3つの方法にスポットを当ててみましょう。
具体的には、JSON、XML、そしてBinary形式でデータを扱う方法を一緒に見ていきます。

各方法のポイントやどんな時に便利なのか、さらには簡単なサンプルコードを交えて、わかりやすく解説していきますよ。
これからお話する内容を通じて、あなたもC#でのシリアライズをマスターできるようになるはずです。

シリアライズってなに?

という方はこちらの記事を参考にしてください。

アイキャッチ(c_sharp)
【初心者向け】C#のシリアライズ、デシアライズとは?わかりやすく解説こんにちは! 今日はプログラミングの世界でよく耳にする「シリアライズ」について、簡単にお話ししましょう。 「シリアライズ」という...

C#でシリアライズする3つの方法

それでは、C#の世界でオブジェクトをシリアライズする方法にはどんなものがあるのか、見ていきましょう。
ここでは、特によく使われる3つの方法をピックアップして紹介します。
これらの方法を知っておけば、さまざまな状況でデータを上手に扱えるようになりますよ。

  1. JSONにシリアライズする方法
  2. JSONはWebをはじめとする多くの場で標準的に使われているデータ形式です。
    C#オブジェクトをJSON形式に変換することで、Web APIなどとの連携が簡単になります。

  3. XMLにシリアライズする方法
  4. XMLは少し昔から使われているデータ形式で、設定ファイルやデータ交換によく使われます。
    C#オブジェクトをXML形式でシリアライズすると、読みやすさや拡張性が高いデータを作ることができます。

  5. Binaryにシリアライズする方法
  6. バイナリ形式でのシリアライズは、データのサイズを小さく保ちたい時や、パフォーマンスを重視する場合に適しています。
    ゲームのセーブデータや、リソースの多いアプリケーションでよく利用される方法です。

これから、それぞれの方法をもう少し詳しく見ていき、どのようにC#で実装するのか、サンプルコードとともに説明していきます。

JSONにシリアライズする方法(Json.NET)

さあ、ここからはもっと具体的に、C#でデータをJSON形式に変換する方法を見ていきましょう。
JSONはWebでデータをやり取りする時によく使われる形式で、そのシンプルさから多くの開発者に愛されています。
今回は、C#の世界で広く使われているJson.NETライブラリを使って、オブジェクトをJSONにシリアライズする方法を紹介します。

まずは、Json.NETライブラリを使うために、プロジェクトにNuGetパッケージNewtonsoft.Jsonを追加しましょう。
これがあると、C#のオブジェクトをJSON形式に簡単に変換できるようになります。

それでは、サンプルコードを見てみましょう。
以下の例では、PersonクラスのインスタンスをJSON形式にシリアライズしています。


using Newtonsoft.Json;

class Program
{
    static void Main(string[] args)
    {
        var person = new Person
        {
            Name = "Taro",
            Age = 30,
            Email = "taro@example.com"
        };

        var json = JsonConvert.SerializeObject(person);
        Console.WriteLine(json);
    }
}

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Email { get; set; }
}

このコードを実行すると、Personオブジェクトが以下のようなJSON文字列に変換されて出力されます。

出力結果

{"Name":"Taro","Age":30,"Email":"taro@example.com"}

このようにJson.NETを使うと、オブジェクトをJSON形式で表現するのがとても簡単になります。
これができると、Web APIとの連携や、データの保存・読み込みがずっとスムーズに行えるようになりますよ。
JSONにシリアライズする方法をマスターすることで、C#のアプリケーション開発がより一層楽しくなるはずです。

XMLにシリアライズする方法(DataContractSerializer)

次に、C#でオブジェクトをXMLにシリアライズする方法を見ていきましょう。
XMLは設定ファイルやデータ交換でよく使用されるフォーマットです。
C#にはDataContractSerializerというクラスが用意されており、これを使うことでオブジェクトを簡単にXML形式でシリアライズできます。

XMLにシリアライズするメリットは、データが人間にも読みやすい形式である点と、データの構造が自己記述的であるため、拡張が容易な点にあります。
では、DataContractSerializerを使ったサンプルコードを見てみましょう。

まずは、シリアライズしたいクラスに[DataContract]属性を、そのプロパティに[DataMember]属性を追加します。
これにより、どのプロパティをシリアライズの対象にするかを明示的に指定できます。


using System.Runtime.Serialization;

class Program
{
    static void Main(string[] args)
    {
        var person = new Person
        {
            Name = "Taro",
            Age = 30,
            Email = "taro@example.com"
        };

        var serializer = new DataContractSerializer(typeof(Person));
        using (var stream = new MemoryStream())
        {
            serializer.WriteObject(stream, person);
            stream.Position = 0;
            using (var reader = new StreamReader(stream))
            {
                var xml = reader.ReadToEnd();
                Console.WriteLine(xml);
            }
        }
    }
}

[DataContract]
class Person
{
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public int Age { get; set; }
    [DataMember]
    public string Email { get; set; }
}

このコードを実行すると、Personオブジェクトが以下のようなXML形式に変換されて出力されます。

出力結果

<Person xmlns="http://schemas.datacontract.org/2004/07/">
  <Age>30</Age>
  <Email>taro@example.com</Email>
  <Name>Taro</Name>
</Person>

この例では、DataContractSerializerを使って簡単にC#オブジェクトをXMLに変換し、その内容をコンソールに出力しています。
XML形式でのデータ表現は、特に設定情報や複雑なデータ構造を持つ情報の交換に適しています。
この方法をマスターすることで、C#のアプリケーションでさらに多様なデータ処理が可能になるでしょう。

Binaryにシリアライズする方法(MessagePack)

今度はもう少し進んだトピックに挑戦してみましょう。
C#でオブジェクトをバイナリ形式にシリアライズする際、MessagePackは非常に効率的な選択肢の一つです。
MessagePackはコンパクトでスピードも速いため、パフォーマンスが求められるアプリケーションに最適な方法と言えるでしょう。

MessagePackはバイナリ形式でデータをシリアライズするライブラリで、JSONよりもずっとデータサイズを小さく保つことができます。
これは、ネットワーク越しにデータを送るときなどに特に便利です。

MessagePackをC#で使うには、まずMessagePackのライブラリをプロジェクトに追加する必要があります。
NuGetパッケージマネージャーを使って「MessagePack」というパッケージをインストールしましょう。

では、MessagePackを使ってオブジェクトをシリアライズするサンプルコードを見てみましょう。


using MessagePack;

class Program
{
    static void Main(string[] args)
    {
        var person = new Person
        {
            Name = "Taro",
            Age = 30,
            Email = "taro@example.com"
        };

        // オブジェクトをMessagePack形式でシリアライズ
        var bytes = MessagePackSerializer.Serialize(person);

        // シリアライズされたデータをコンソールに出力(バイナリなので、読みやすい形に変換)
        Console.WriteLine(BitConverter.ToString(bytes));

        // デシリアライズして元のオブジェクトを復元(デモ用)
        var deserializedPerson = MessagePackSerializer.Deserialize<Person>(bytes);
        Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}, Email: {deserializedPerson.Email}");
    }
}

[MessagePackObject]
public class Person
{
    [Key(0)]
    public string Name { get; set; }
    [Key(1)]
    public int Age { get; set; }
    [Key(2)]
    public string Email { get; set; }
}

このコードでは、PersonオブジェクトをMessagePack形式でシリアライズし、そのバイナリデータをコンソールに出力しています。

出力したバイナリ

93-A4-54-61-72-6F-1E-B0-74-61-72-6F-40-65-78-61-6D-70-6C-65-2E-63-6F-6D

さらに、デシリアライズのプロセスも示して、シリアライズとデシリアライズがどのように機能するかを実演しています。

デシアライズしたバイナリ

Name: Taro, Age: 30, Email: taro@example.com

MessagePackを使ったシリアライズは、特にデータサイズを抑えたい場合や、転送速度を速くしたい場合に役立ちます。

BinaryFormatterは非推奨

バイナリシリアライズの話をするとき、BinaryFormatterっていうワードをよく聞くかもしれませんね。
しかし、最新のセキュリティのお話になると、実はBinaryFormatterはあまり褒められた存在ではなくなっているんです。
なぜこんな変わりようがあったのか、そしてもっと安全な方法は何か、一緒に見ていきましょう。

以前はBinaryFormatterがC#の世界でよく使われていました。
でも、この方法でシリアライズされたデータから、予期しないコードが実行されるリスクがあることがわかったんです。
つまり、あまり安全ではないんですね。

セキュリティを守るためにはどうすればいいかというと、MicrosoftがBinaryFormatterの代わりにもっと安全なシリアライズ方法を推奨しています。
例えば、System.Text.JsonNewtonsoft.Jsonを使ったJSON形式のシリアライズ、あるいはXmlSerializerDataContractSerializerを使ったXML形式のシリアライズが挙げられます。
これらはセキュリティをしっかり保ちつつ、データのシリアライズを行えるんです。

では、もう少し具体的に見てみましょう。
もし今後BinaryFormatterを使ったこんなコードを見かけたら、ちょっと古いかなと思ってください。


// 非推奨: BinaryFormatterを使ったシリアライズの例
var formatter = new BinaryFormatter();
using (var stream = new FileStream("data.bin", FileMode.Create, FileAccess.Write))
{
    formatter.Serialize(stream, myObject);
}

このように、セキュリティをきちんと考えながらも、シリアライズが必要な時に安全な方法を選べるようになれば、より信頼性の高いアプリケーションを作ることができますね。
BinaryFormatterを使った方法から、新しい安全な方法への移行を意識してみましょう。

その他のシリアライズする方法

これまでにいくつかのシリアライズ方法を見てきましたが、C#の世界には他にもいろいろな方法があります。
ここでは、よく使用される別のシリアライズ方法を6つ紹介します。
これらの方法も知っておくと、さまざまな状況に対応できるようになりますよ!

  1. System.Text.Json
  2. .NET Core 3.0から導入された、軽量で高速なJSONシリアライズ・デシリアライズライブラリです。
    シンプルなAPIが特徴で、モダンな.NETアプリケーションにおいて標準的な選択肢になりつつあります。

  3. XmlSerializer
  4. .NETの初期から存在するXMLシリアライズのクラシックな方法です。
    特定のクラスをXMLドキュメントに変換するのに便利で、設定ファイルや簡単なデータ保存によく使われます。

  5. Protobuf-net
  6. Googleが開発したProtocol Buffersは、バイナリシリアライズフォーマットの一つで、非常に効率的なデータ表現が可能です。
    Protobuf-netは、このフォーマットを.NETで扱うためのライブラリです。

  7. YamlDotNet
  8. YAMLは人間にも読みやすく、かつマシンにも扱いやすいデータ表現フォーマットです。
    YamlDotNetは、C#でYAML形式のデータをシリアライズ・デシリアライズするためのライブラリです。

  9. Avro
  10. Apache Avroは、リモートプロシージャコール(RPC)とデータシリアライズのためのフレームワークです。
    大量のデータを扱う分散システムでの使用に適しています。

  11. Bond
  12. Microsoftが開発したBondは、軽量なシリアライズライブラリで、高度に最適化されたバイナリ形式でデータをシリアライズします。
    複雑なデータ構造を持つデータのシリアライズに強みがあります。

各シリアライズ方法には、それぞれのユニークな特徴と利点があります。
プロジェクトの要件に応じて、最適なシリアライズ方法を選択してみてくださいね。

キャリア形成/給与還元
ひとつひとつ真摯に向き合う企業
ONE_WEDGE社員募集

株式会社 ONE WEDGEでは、新たな仲間を募集しています!

私たちと一緒に、革新的で充実したキャリアを築きませんか?
当社は、従業員が仕事と私生活のバランスを大切にできるよう、充実した福利厚生を整えています。

  • 完全週休2日制(土日休み)で、祝日や夏季休暇、年末年始休暇もしっかり保証!
  • 様々な休暇制度(有給、慶弔、産前・産後、育児、バースデー休暇)を完備!
  • 従業員の成長と健康を支援するための表彰制度、資格取得支援、健康促進手当など!
  • 生活を支えるテレワーク手当、記事寄稿手当、結婚祝金・出産祝金など、様々な手当を提供!
  • 自己啓発としての書籍購入制度や、メンバー間のコミュニケーションを深める交流費補助!
  • 成果に応じた決算賞与や、リファラル採用手当、AI手当など、頑張りをしっかり評価!
  • ワークライフバランスを重視し、副業もOK!

株式会社 ONE WEDGEでは、一人ひとりの従業員が自己実現できる環境を大切にしています。
共に成長し、刺激を与え合える仲間をお待ちしております。
あなたの能力と熱意を、ぜひ当社で発揮してください。
ご応募お待ちしております!

ホームページ、採用情報は下記ボタンからご確認ください!

応募、ご質問など、LINEでお気軽にご相談ください♪

まとめ

これで、C#におけるデータやオブジェクトをシリアライズする主な方法を幅広く見てきましたね。
シリアライズはデータの保存や通信で非常に重要な役割を担っており、適切な方法を選ぶことでアプリケーションのパフォーマンスや安全性を大きく向上させることができます。

今回は、Json.NET、DataContractSerializer、MessagePackをはじめ、その他多くのシリアライズ手法について触れてきました。
それぞれの方法には独自の特徴と利点があり、プロジェクトの要件に応じて最適なものを選択することが重要です。

シリアライズは開発の多くの場面で避けて通れないテーマです。
今回紹介した内容が、あなたのC#におけるシリアライズ作業の理解を深め、より効率的でセキュアな開発に役立つことを願っています。
プログラミングの旅は常に新しい発見があり、今回学んだことが次のステップへの足掛かりになるはずです。
楽しみながら、素晴らしいコードを書いていきましょう!

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です