C Sharpの基礎 - シリアライズ
ナビゲーションに移動
検索に移動
概要
クラスの内容をバイナリファイルに保存する簡単な方法として、BinaryFormatterクラスを使う方法がある。
BinaryFormatterクラスを使用してクラスをシリアル化し、FileStreamでファイルに書き込む。
※補足
BinaryFormatterクラスの代わりにSoapFormatterクラスを使って、XMLファイルに保存することもできる。
SoapFormatterクラスの使い方は、ここで紹介している方法とほぼ同じである。
サンプルコード
ここでは次のようなTestClassクラスがあるものとし、BinaryFormatterクラスを使ってTestClassオブジェクトをバイナリファイルに保存する方法を記述する。
public class TestClass
{
private string _message;
private int _number;
public string Message
{
get {return _message;}
set {_message = value;}
}
public int Number
{
get {return _number;}
set {_number = value;}
}
public TestClass(string str, int num)
{
_message = str;
_number = num;
}
}
まず、次のようにTestClassオブジェクトにSerializableAttribute属性を付加する必要がある。
[Serializable()]
public class TestClass
{
// (省略)
}
TestClassオブジェクトを保存、復元する具体的なコードを以下に記述する。
SaveToBinaryFileメソッドでオブジェクトを保存し、LoadFromBinaryFileメソッドでオブジェクトの復元ができる。
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
public class MainClass
{
public static void Main()
{
// 保存先のファイル名
string fileName = @"C:\test.obj";
// TestClassオブジェクトを作成
TestClass obj1 = new TestClass("テスト", 123);
// オブジェクトの内容をファイルに保存する
SaveToBinaryFile(obj1, fileName);
// オブジェクトの内容をファイルから読み込み復元する
TestClass obj2 = (TestClass)LoadFromBinaryFile(fileName);
// 読み込んだオブジェクトの内容を表示
Console.WriteLine(obj2.Message);
Console.WriteLine(obj2.Number);
Console.ReadLine();
}
/// <summary>
/// オブジェクトの内容をファイルから読み込み復元する
/// </summary>
/// <param name="path">読み込むファイル名</param>
/// <returns>復元されたオブジェクト</returns>
public static object LoadFromBinaryFile(string path)
{
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
BinaryFormatter f = new BinaryFormatter();
// 読み込んで逆シリアル化する
object obj = f.Deserialize(fs);
fs.Close();
return obj;
}
/// <summary>
/// オブジェクトの内容をファイルに保存する
/// </summary>
/// <param name="obj">保存するオブジェクト</param>
/// <param name="path">保存先のファイル名</param>
public static void SaveToBinaryFile(object obj, string path)
{
FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);
BinaryFormatter bf = new BinaryFormatter();
// シリアル化して書き込む
bf.Serialize(fs, obj);
fs.Close();
}
}
保存しないフィールドを指定する
上記のように、BinaryFormatterを使用してオブジェクトを保存した場合、保存されるのはクラスのフィールドで、パブリックフィールドとプライベートフィールドも保存される。
保存したくないフィールドにはNonSerializedAttribute属性を付ける。
次の例では、TestClassの_numberフィールドをシリアル化の対象から除外し、保存されないようにしている。
[Serializable()]
public class TestClass
{
private string _message;
[NonSerialized()]
private int _number;
// (省略)
}