「C Sharpの基礎 - シリアライズ」の版間の差分
ナビゲーションに移動
検索に移動
細 (Wiki がページ「クラスの内容をバイナリファイルに保存または復元する(C Sharp)」を「C Sharpの基礎 - シリアライズ」に、リダイレクトを残さずに移動しました) |
(→概要) |
||
1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
クラスの内容をバイナリファイルに保存する簡単な方法として、<code>BinaryFormatter</code>クラスを使う方法がある。<br> | |||
<code>BinaryFormatter</code>クラスを使用してクラスをシリアル化して、<code>FileStream</code>でファイルに書き込む。<br> | |||
<br> | <br> | ||
<code>BinaryFormatter</code>クラスの代わりに<code>SoapFormatter</code>クラスを使って、XMLファイルに保存することもできる。<br> | |||
'' | <code>SoapFormatter</code>クラスの使い方は、ここで記載している方法とほぼ同様である。<br> | ||
<br> | |||
* 対象となるクラスの条件 | |||
** publicである | |||
**: publicではないクラスをシリアル化しようとすると、以下に示す<code>InvalidOperationException</code>例外が発生する。 | |||
**:<code>"保護レベルの設定が原因で 'ProjectName.ClassName' にアクセスできません。パブリックの型のみ処理できます。"</code> | |||
** publicな既定のコンストラクタを有する | |||
**: publicな既定のコンストラクタを持たないクラスをシリアル化しようとすると、以下に示す<code>InvalidOperationException</code>例外が発生する。 | |||
**: <code>"ProjectName.ClassName にはパラメーターを持たないコンストラクターが含まれていないため、これをシリアル化することはできません。"</code> | |||
*: <br> | |||
* 対象となる要素 | |||
** publicフィールド | |||
** getアクセサおよびsetアクセサを有するpublicプロパティ | |||
<br><br> | <br><br> | ||
2021年6月8日 (火) 09:33時点における版
概要
クラスの内容をバイナリファイルに保存する簡単な方法として、BinaryFormatter
クラスを使う方法がある。
BinaryFormatter
クラスを使用してクラスをシリアル化して、FileStream
でファイルに書き込む。
BinaryFormatter
クラスの代わりにSoapFormatter
クラスを使って、XMLファイルに保存することもできる。
SoapFormatter
クラスの使い方は、ここで記載している方法とほぼ同様である。
- 対象となるクラスの条件
- publicである
- publicではないクラスをシリアル化しようとすると、以下に示す
InvalidOperationException
例外が発生する。 "保護レベルの設定が原因で 'ProjectName.ClassName' にアクセスできません。パブリックの型のみ処理できます。"
- publicではないクラスをシリアル化しようとすると、以下に示す
- publicな既定のコンストラクタを有する
- publicな既定のコンストラクタを持たないクラスをシリアル化しようとすると、以下に示す
InvalidOperationException
例外が発生する。 "ProjectName.ClassName にはパラメーターを持たないコンストラクターが含まれていないため、これをシリアル化することはできません。"
- publicな既定のコンストラクタを持たないクラスをシリアル化しようとすると、以下に示す
- publicである
- 対象となる要素
- publicフィールド
- getアクセサおよびsetアクセサを有するpublicプロパティ
サンプルコード
ここでは次のような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;
// (省略)
}