[C#] シリアライズ(Serialization)をする方法
こんにちは。明月です。
この投稿はC#でシリアライズ(Serialization)をする方法に関する説明です。
シリアライズとはメモリに割り当てしているクラスのデータをバイナリ化することです。つまり、クラス内部で変数のデータをすべてbyteタイプに変換することだと思えば良いです。
シリアライズは昔にたくさん使った記憶がありますが、最近はシリアライズよりJsonタイプに変換してデータ化することがトレンドなので、最近はよく使わないみたいです。
link - [C#] Newtonsoft.JSONライブラリを利用してJsonデータ構造を扱う方法
でも、Newtonsoft.Jsonを利用してデータをJsonタイプに変換することはクラスのPublicタイプだけ変換するし、データをすべてStringタイプに変換するので、限界があります。
シリアライズはPublicデータだけではなく、Privateも構造化するし、クラス自体をすべてByteタイプに変換することなので、クラス自体を格納することではよいです。
でも、シリアライズも短所があります。バイナリ化するので、当該なデータを人が読みにくいです。なのでメモ帳でデータ変更ができないです。
また、クラス自体を変換しましたから、クラスが変更がある場合に復元ができない可能性もあります。
Jsonも場合はプログラム言語に関係しずに、読み込む移植性がよいですが、シリアライズはC#で作成したらC#しか読み込まれないです。
正確にはクラス変更や他のプレートフォームでも読み込まられないことではないですが、データ漏れが発生したり、データが可笑しくなる可能性があります。
つまり、バグ発生する可能性があることです。
仕様によってシリアライズがよいかJsonを使うかを正しく選択して使う方がよいです。
Copy! [Source view] Program.csusing System; using System.IO; // シリアライズのライブラリ using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; namespace Example { // シリアライズを使うために、当該クラスのアトリビュートに宣言する。 [Serializable] // テストクラス class Node { // 変数 - データ格納はコンストラクタで出力はPrint関数だけ。 private string data; // コンストラクタ public Node(string data) { this.data = data; } // 出力関数 public void Print() { // コンソールに出力 Console.WriteLine(this.data); } } class Program { // 実行関数 static void Main(string[] args) { // テストクラスを宣言 // node.dataには「Test」データが格納される var node = new Node("Test"); // シリアライズフォーマットクラス var formatter = new BinaryFormatter(); // クラスをシリアライズして格納する変数 byte[] data; // Streamでシリアライズしてdata変数にデータをコピーする。 using (var stream = new MemoryStream()) { // クラスをStreamタイプに変換 formatter.Serialize(stream, node); // 変数のサイズを割り当てする。 data = new byte[stream.Length]; // Streamのデータをbyteタイプに変換 data = stream.GetBuffer(); } // シリアライズしたデータをファイルに格納する。 using (var stream = new FileStream("c:\\work\\Serializable.dat", FileMode.Create, FileAccess.Write)) { stream.Write(data, 0, data.Length); } // データを読み込む var info = new FileInfo("c:\\work\\Serializable.dat"); // データを再割り当てする。 data = new byte[info.Length]; // ファイルからデータを読み込む。 using (var stream = info.OpenRead()) { stream.Read(data, 0, data.Length); } // Streamでデータをデシリアライズする。 using (MemoryStream stream = new MemoryStream()) { // byteをStreamに読み込む。 stream.Write(data, 0, data.Length); // Stream seekを最初に移動する。 stream.Seek(0, SeekOrigin.Begin); // クラスをデシリアライズしてNodeクラスにキャストする。 node = (Node)formatter.Deserialize(stream); } // データを出力する。 node.Print(); Console.WriteLine("Press any key..."); Console.ReadKey(); } } }
Nodeというクラスをシリアライズしてbyte[]タイプに変換しました。変換してファイルに格納します。
また、格納したファイルを読み込んでデシリアライズでbyte[]データをクラスタイプに変換します。
ファイルをメモ帳で開きました。
人が解析することでは無理があります。
ここまでC#でシリアライズ(Serialization)をする方法に関する説明でした。
ご不明なところや間違いところがあればコメントしてください。
- [C#] Redisのデータベースを接続して使い方2022/02/15 18:46:09
- [C#] 非同期ソケット通信(IOCP)-APMパターン2020/05/18 18:45:37
- [C#] 非同期ソケット通信(IOCP)-EAPパターン2020/05/15 19:31:02
- [C#] NPOIを利用してExcelを読み込んで出力する方法2020/05/08 10:43:52
- [C#] NPOIライブラリを利用してエクセルファイルを生成する方法2020/05/07 01:49:01
- [C#] Geckoライブラリを利用してウェブスクレイピングする方法2020/05/05 00:52:26
- [C#] PDFを作成する方法(iTextSharp)2020/05/03 10:22:40
- [C#] シリアライズ(Serialization)をする方法2020/04/30 19:32:04
- [C#] dynamicタイプの動的パラメータ-DynamicObject(WinFormでASP.MVCのViewBagオブジェクトを使用する方法)2020/04/29 22:41:32
- [C#] Stringの補間式(interpolation)2020/04/27 20:39:57
- [C#] Newtonsoft.JSONライブラリを利用してJsonデータ構造を扱う方法2020/04/23 20:19:53
- [C#] EMailを送信する方法(System.Net.Mail)2020/04/22 19:00:42
- [C#] ini環境ファイルを使う方法2020/04/22 00:09:39
- [C#] 環境設定ファイルを扱う方法(System.Configuration)2020/04/20 19:37:57
- [C#] Reflectionを利用してクラス複製する方法2020/04/17 00:34:33
- check2024/04/10 19:03:53
- [Java] 64.Spring bootとReactを連結する方法(Buildする方法)2022/03/25 21:02:18
- [Javascript] Node.jsをインストールしてReactを使う方法2022/03/23 18:01:34
- [Java] 63. Spring bootでcronスケジューラとComponentアノテーション2022/03/16 18:57:30
- [Java] 62. Spring bootでWeb-Filterを設定する方法(Spring Security)2022/03/15 22:16:37
- [Java] JWT(Json Web Token)を発行、確認する方法2022/03/14 19:12:58
- [Java] 61. Spring bootでRedisデータベースを利用してセッションクラスタリング設定する方法2022/03/01 18:20:52
- [Java] 60. Spring bootでApacheの連結とロードバランシングを設定する方法2022/02/28 18:45:48
- [Java] 59. Spring bootのJPAでEntityManagerを使い方2022/02/25 18:27:48
- [Java] 58. EclipseでSpring bootのJPAを設定する方法2022/02/23 18:11:10
- [Java] 57. EclipseでSpring bootを設定する方法2022/02/22 19:04:49
- [Python] Redisデータベースに接続して使い方2022/02/21 18:23:49
- [Java] Redisデータベースを接続して使い方(Jedisライブラリ)2022/02/16 18:13:17
- [C#] Redisのデータベースを接続して使い方2022/02/15 18:46:09
- [CentOS] Redisデータベースをインストールする方法とコマンドを使い方2022/02/14 18:33:07