クラスオブジェクトをバイナリで入出力する(BinaryFormatter)

ファイル/フォルダ

今回は、クラスオブジェクトをバイナリファイルとして出力する方法を説明します。

バイナリファイルは、コンピューターが読み書きをする目的のファイルでテキストエディタでは編集することはできません。

サンプルデータ

今回、設定情報が格納されているクラスオブジェクトを作成しました。

設定クラス

バイナリファイルとして出力する場合、そのクラスがシリアライズ可能であることを示すため[Serializable]属性を設定します
注意点としてはクラスはpublicで宣言する必要があります。

[Serializable]
public class ConfigClass
{
    public string StrValue { get; set; } = "";  //文字列情報
    public int NumValue { get; set; } = 0;      //数値情報
    public int[] ArrayValue { get; set; }       //配列情報
    [System.Xml.Serialization.XmlIgnore] 
    public string HiddenValue { get; set; }     //出力しない情報(XML出力の時、対象外にする)
}

オブジェクト作成

private ConfigClass _config = new ConfigClass();

データ設定

//設定
_config.StrValue = "文字情報";
_config.NumValue = 9999;
_config.ArrayValue = new int[] {1, 9, 34, 332, 764};
_config.HiddenValue = "XML出力では出力しない情報";

BinaryFormatterを使って、クラスオブジェクトを書き込む

FileStreamを使いファイル出力します。

//出力先を取得
string output_path = "";
using (SaveFileDialog dlg = new SaveFileDialog())
{
    dlg.Filter = @"bin(*.bin)|*.bin";

    if (dlg.ShowDialog() != DialogResult.OK)
    {
        //OK以外は処理を抜ける
        return;
    }

    output_path = dlg.FileName;
}

using (FileStream fs = new FileStream(output_path, FileMode.Create, FileAccess.Write))
{
    BinaryFormatter bf = new BinaryFormatter();

    //クラスオンジェクトをシリアライズしてバイナリファイルとして書き込む
    bf.Serialize(fs, _config);

    fs.Close();    
}

実行結果

次のような文字化けしたファイルが出力されました。これは失敗ではなくバイナリで出力された結果です。

BinaryFormatterを使って、クラスオブジェクトを読み込む

//XMLファイルを取得
string input_path = "";
using (OpenFileDialog dlg = new OpenFileDialog())
{
    dlg.Filter = @"bin(*.bin)|*.bin";

    if (dlg.ShowDialog() != DialogResult.OK)
    {
        //OK以外は処理を抜ける
        return;
    }

    input_path = dlg.FileName;
}

using (FileStream fs = new FileStream(input_path, FileMode.Open, FileAccess.Read))
{
    BinaryFormatter bf = new BinaryFormatter();

    //取得したバイナリファイルをデシリアライズしてクラスに戻す
    ConfigClass _config = bf.Deserialize(fs) as ConfigClass;

    fs.Close();
}

実行結果

まとめ

保存したい内容をバイナリファイルで出力しておけば、基本的にはユーザーに編集されることがありません。変更されたくない情報をローカルに保存しておく場合には、バイナリ出力がいいでしょう。

バイナリエディタで編集する人はごく少数だとは思いますが、そこまで対策をするとなると暗号化する必要はあるかと思います。

ここまで読んでいただいてありがとうございます。この記事が皆様のお役に立てたら幸いです。

コメント

タイトルとURLをコピーしました