C Sharpの基礎 - シリアライズ

提供:MochiuWiki : SUSE, EC, PCB
2019年10月20日 (日) 14:18時点における192.168.1.24による版 (ページの作成:「== 概要 == クラスの内容をバイナリファイルに保存する簡単な方法として、BinaryFormatterクラスを使う方法がある。<br> BinaryFormatte…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

概要

クラスの内容をバイナリファイルに保存する簡単な方法として、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;
    // (省略)
 }