MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
C Sharpの基礎 - シリアライズのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
C Sharpの基礎 - シリアライズ
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == クラスの内容をバイナリファイルに保存する簡単な方法として、<code>BinaryFormatter</code>クラスを使う方法がある。<br> <code>BinaryFormatter</code>クラスを使用してクラスをシリアル化して、<code>FileStream</code>でファイルに書き込む。<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> == サンプルコード == ここでは次のようなTestClassクラスがあるものとし、BinaryFormatterクラスを使ってTestClassオブジェクトをバイナリファイルに保存する方法を記述する。 <source lang="c#"> 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; } } </source> <br> まず、次のようにTestClassオブジェクトにSerializableAttribute属性を付加する必要がある。 <source lang="c#"> [Serializable()] public class TestClass { // (省略) } </source> <br> TestClassオブジェクトを保存、復元する具体的なコードを以下に記述する。<br> SaveToBinaryFileメソッドでオブジェクトを保存し、LoadFromBinaryFileメソッドでオブジェクトの復元ができる。<br> <source lang="c#"> 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(); } } </source> <br> '''保存しないフィールドを指定する'''<br> 上記のように、BinaryFormatterを使用してオブジェクトを保存した場合、保存されるのはクラスのフィールドで、パブリックフィールドとプライベートフィールドも保存される。<br> 保存したくないフィールドにはNonSerializedAttribute属性を付ける。<br> <br> 次の例では、TestClassの_numberフィールドをシリアル化の対象から除外し、保存されないようにしている。<br> <source lang="c#"> [Serializable()] public class TestClass { private string _message; [NonSerialized()] private int _number; // (省略) } </source> <br><br> __FORCETOC__ [[カテゴリ:C_Sharp]]
C Sharpの基礎 - シリアライズ
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse