構造体をシリアライズしてファイルに保存/デシリアライズして構造体に
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;
}






JavaScriptを使用しています。