構造体をシリアライズしてファイルに保存/デシリアライズして構造体に
Category - C# のメモ - [1]
いつも使うので、メモ。
AppSaveObjという構造体を作り、保存に必要な情報を持たせることとします。
まずは適当に構造体を定義します。
(参照)
using System.Runtime.InteropServices; // for DllImport , StructLayout関係
★構造体(AppSaveObj構造体 および 関連する構造体)を定義
// 保存でシリアライズするので Serializable 属性追加 [Serializable, StructLayout(LayoutKind.Sequential, Pack = 1)] public struct AppSaveObj { public string sv_AppName; public DataObj sv_DataObj; public string sv_AppVer; } // AppSaveObjに含まれているので、シリアライズできるよう Serializable 属性追加 [Serializable, StructLayout(LayoutKind.Sequential, Pack = 1)] public struct DataObj { public bool dataA; public byte dataB; public string dataC; public ushort[] dataD_Ary; public string[] dataE_Ary; public SettingObj setObj; } // AppSaveObj(のDataObj)に含まれているので、シリアライズできるよう Serializable 属性追加 [Serializable, StructLayout(LayoutKind.Sequential, Pack = 1)] public struct SettingObj { public bool setA; public int setB; public string setC; public ushort[] setD_Ary; }
シリアライズ、デシリアライズは以下のような感じで行います。
★構造体(AppSaveObj)をシリアライズしてファイルに保存
/// <summary> /// ファイルに保存 /// ...引数 DataObj dobj に保存するデータを指定して呼び出すこと /// </summary> private bool SerializeToFile(string sPath, DataObj dobj) { bool bRet = false; try { if (string.IsNullOrEmpty(sPath)) { MessageBox.Show("保存先ファイルパスが無効です。"); return false; } // 保存用Objをつくる AppSaveObj aso = new AppSaveObj(); aso.sv_AppName = Application.ProductName; // アプリ名を埋め込む aso.sv_DataObj = dobj; // 保存するデータ // アセンブリ情報からアプリケーションのバージョンを取得して埋め込む aso.sv_AppVer = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); // シリアライズしてファイルに保存 FileStream fs = new FileStream(sPath, FileMode.Create); try { //シリアライズ BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(fs, aso); bRet = true; } catch { } finally { fs.Close(); } } catch { } return bRet; }
★保存ファイルを開き、デシリアライズして構造体(AppSaveObj)に
/// <summary> /// 保存ファイルを開く /// </summary> public bool DeSerilizeFromFile(string sPath) { bool bRet = false; try { if (string.IsNullOrEmpty(sPath) || !File.Exists(sPath)) { MessageBox.Show("ファイルパスが無効です。"); return false; } FileStream fs = new FileStream(sPath, FileMode.Open); try { // ----- デシリアイズ ----- bool bCancel = false; BinaryFormatter formatter = new BinaryFormatter(); AppSaveObj aso = (AppSaveObj)formatter.Deserialize(fs); //デシリアイズ // ----- 保存用Objを検証 ----- // 保存Objに埋め込んでいるアプリケーション名が一致するかチェック if (aso.sv_AppName != Application.ProductName) { MessageBox.Show("このファイルは開けません。"); bCancel = true; // 開くのヤメ } // 現在のアプリケーションのバージョンと比較 if (!bCancel) { string sVer = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); int nComp = string.Compare(aso.sv_AppVer, sVer, true); // 比較 if (nComp > 0) { // 現在のアプリケーション バージョンより大きい場合 // 開けないようにする MessageBox.Show("新しいバージョンで作成されたファイルは開けません。"); bCancel = true; // 開くのヤメ } } // ----- 保存されたデータをロード ----- if (!bCancel) { // aso.sv_DataObj が保存されたデータとなる // 保存されたデータを読んでフォームに表示するとかの処理を行う // SetForm は DataObj を元にフォームに表示する処理を行うものとする if (!SetForm(aso.sv_DataObj)) MessageBox.Show("保存ファイルからのデータ読み込みに失敗しました。"); else bRet = true; } } catch { } finally { fs.Close(); } } catch { } return bRet; }