お気に入りに追加

Admin Write

Admin Set Info

JavaScriptを使用しています。

構造体をシリアライズしてファイルに保存/デシリアライズして構造体に

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;
}



ホーム利用規約個人情報について免責事項このサイトについて
Copyright (C) 2010 zutsuki. All Rights Reserved.