C#でXMLシリアライズをマスター!初心者向け保存・読み込み完全ガイド
生徒
「C#で作ったゲームのセーブデータや設定をファイルに保存したいのですが、どうすればいいですか?」
先生
「それならXMLという形式でデータを保存するのがおすすめですよ。シリアライズという技術を使えば簡単に実現できます。」
生徒
「シリアライズ?なんだか難しそうですね。初心者でもできますか?」
先生
「大丈夫です!データの箱をファイルに変える魔法のような仕組みを、基礎からゆっくり解説していきますね。」
1. シリアライズとデシリアライズとは?
プログラミングの世界には、シリアライズとデシリアライズという重要な言葉があります。初めて聞く方には難しく感じるかもしれませんが、実はとても単純な仕組みです。
まず、シリアライズとは、プログラムの中で扱っているデータ(変数やクラスの中身)を、ファイルに保存したりネットワークで送ったりできる形式に変換することを指します。イメージとしては、組み立てたレゴブロックを、箱に詰めるために一度バラバラにして、説明書と一緒に整理するようなものです。C#では、この変換先としてよく使われるのがXML(エックスエムエル)という形式です。
逆に、デシリアライズとは、保存されたファイルなどのデータから、元のプログラム上のデータに復元することを言います。バラバラにして箱に詰めたレゴを、説明書を見ながら元の形に組み立て直す作業だと考えてください。この二つの仕組みを覚えることで、アプリケーションを終了してもデータを残しておくことができるようになります。
2. XML形式の基本構造を知ろう
XMLは、データをタグで囲んで表現する形式です。インターネットのホームページを作るHTMLに似ていますが、XMLは「データの意味」を記述することに特化しています。例えば、プレイヤーの名前とレベルを保存する場合、以下のような見た目になります。
<PlayerData>
<Name>勇者タロウ</Name>
<Level>15</Level>
</PlayerData>
このように、データが何を表しているのかが人間にも一目でわかるのがXMLの大きなメリットです。タグ(カッコで囲まれた部分)の名前は自分で自由に決めることができます。C#でこのXMLを扱うためには、まずデータを格納するためのクラスという設計図を作る必要があります。
3. データを保存するための準備(クラスの作成)
C#でシリアライズを行うには、まず「何を保存したいか」を決めるクラスを作成します。このとき、重要なポイントがいくつかあります。まず、クラスやその中のデータ(プロパティ)はpublic(パブリック)という公開設定にする必要があります。外から見えない秘密のデータは、シリアライズの仕組みが読み取れないからです。また、引数のないコンストラクタ(初期化処理)が必要ですが、基本的には自動で作られるので、まずはシンプルなクラスを作ってみましょう。
using System;
// 保存したいデータの設計図
public class GameSettings
{
public string PlayerName { get; set; }
public int Volume { get; set; }
public bool IsFullScreen { get; set; }
}
このコードでは、プレイヤー名、音量、フルスクリーンの設定という3つの情報をまとめた箱を作りました。この箱の中身をファイルに書き出すのが、次のステップです。
4. 実際にXMLファイルへ保存してみる
それでは、作成したデータをXMLファイルとして書き出してみましょう。これにはXmlSerializerという便利な道具を使います。ファイルを扱うときは、使い終わった後にファイルを閉じる作業が必要ですが、C#のusingという命令を使うと、自動的に後片付けをしてくれるので安心です。
using System;
using System.IO;
using System.Xml.Serialization;
public class Program
{
public static void Main()
{
// 1. 保存するデータを作成
GameSettings settings = new GameSettings
{
PlayerName = "たろう",
Volume = 80,
IsFullScreen = true
};
// 2. XMLに変換するための道具を準備
XmlSerializer serializer = new XmlSerializer(typeof(GameSettings));
// 3. 書き込み先のファイルを作成
using (StreamWriter sw = new StreamWriter("settings.xml"))
{
// 4. シリアライズ実行!
serializer.Serialize(sw, settings);
}
Console.WriteLine("ファイルの保存が完了しました。");
}
}
このプログラムを実行すると、パソコンの中に「settings.xml」というファイルが作られます。中身を開くと、先ほど説明したタグの形式でデータが記録されていることが確認できます。
5. XMLファイルからデータを読み込む方法
一度保存したファイルは、次にプログラムを起動したときに読み込みたいですよね。今度はデシリアライズを使って、ファイルからデータを取り出し、C#の変数に戻す作業を行います。書き込みのときとほぼ同じ手順ですが、使う命令がDeserializeに変わります。
using System;
using System.IO;
using System.Xml.Serialization;
public class Program
{
public static void Main()
{
// 1. XMLを読み込むための道具を準備
XmlSerializer serializer = new XmlSerializer(typeof(GameSettings));
// 2. 読み込むファイルを開く
using (StreamReader sr = new StreamReader("settings.xml"))
{
// 3. デシリアライズ実行!
// 読み込んだものをGameSettingsの形として解釈します
GameSettings loadedSettings = (GameSettings)serializer.Deserialize(sr);
// 4. 読み込んだデータの表示
Console.WriteLine("名前: " + loadedSettings.PlayerName);
Console.WriteLine("音量: " + loadedSettings.Volume);
Console.WriteLine("全画面: " + loadedSettings.IsFullScreen);
}
}
}
実行結果は以下のようになります。ファイルに書いてあった文字や数字が、しっかりプログラムの変数として復活しています。
名前: たろう
音量: 80
全画面: True
6. リスト形式のデータを扱うテクニック
実際のアプリ開発では、1つのデータだけでなく、複数のデータ(リスト)をまとめて保存したいことが多いです。例えば、アイテムの一覧やハイスコアのランキングなどです。C#のListという機能を使えば、これらも簡単にXML化できます。リストをまるごとシリアライズすることで、複数のオブジェクトを一つのファイルにまとめることが可能です。
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
public class Item
{
public string Name { get; set; }
public int Price { get; set; }
}
public class Program
{
public static void Main()
{
// アイテムリストの作成
List<Item> inventory = new List<Item>
{
new Item { Name = "薬草", Price = 10 },
new Item { Name = "毒消し", Price = 20 },
new Item { Name = "聖水", Price = 50 }
};
XmlSerializer serializer = new XmlSerializer(typeof(List<Item>));
using (StreamWriter sw = new StreamWriter("items.xml"))
{
serializer.Serialize(sw, inventory);
}
Console.WriteLine("アイテムリストを保存しました。");
}
}
このように、複雑なデータ構造であっても、XmlSerializerは柔軟に対応してくれます。リストを使う場合は、シリアライザーを作る際の型指定にtypeof(List<Item>)と書くのがポイントです。
7. エラーを防ぐための注意点とコツ
XML操作をするときに初心者がつまずきやすいポイントがいくつかあります。まず、ファイルが読み取り専用になっていたり、他のソフトで開いたままだったりするとエラーが発生します。また、保存しようとしているデータの中に、XMLで扱えない特殊な記号が含まれている場合も注意が必要です。
さらに、クラスの構造を途中で変えてしまうと、以前保存した古いファイルが読み込めなくなることがあります。例えば、プロパティの名前を変えたり、型を変更したりした場合です。開発を進める中でデータの形が変わることはよくありますが、その際は古いファイルとの互換性をどう保つかを考える必要があります。まずは、一番シンプルな構造から始めて、正しく保存と読み込みができることを確認しながら機能を拡張していくのが、プログラミング上達の近道です。
8. XMLとJSONの使い分けについて
最後に、よく比較されるJSON(ジェイソン)についても触れておきましょう。現代のプログラミングでは、XMLよりもJSONの方が人気があります。JSONの方が文字数が少なく、データのサイズが小さくて済むためです。しかし、XMLは古いシステムとの相性が良かったり、設定ファイルを人間が直接書き換えやすかったりするという独自の強みがあります。
どちらを使うべきか迷ったら、まずは今回学んだXMLを試してみてください。基本的な考え方はJSONでも全く同じです。「データを特定の形式に変換して保存し、それをまた元に戻す」という一連の流れさえ理解してしまえば、どんな形式のデータ操作も怖くありません。C#には豊富なライブラリが用意されているので、まずは手を動かして、自分の作ったデータがファイルとして形に残る感動を味わってみましょう。