このチュートリアルでは、オブジェクトを圧縮ファイルにシリアライズする方法、およびそのオブジェクトをメモリにロードする方法について説明します。
この例では、NorthWind データベースを使用してデータテーブルを作成します。テーブルは、通常のストリームと圧縮ストリームに保存(シリアライズ)されます。最後に、どちらかのストリームからデータがロードされます。最終アプリケーションは、次の図のように表示されます。
新しい Visual Studio プロジェクトを開始し、ツールボックスからフォームに次のコントロールを追加します。
ボタン | Button.Text プロパティ | Button.Name プロパティ | Button.Enabled プロパティ |
---|---|---|---|
1 | DataTable の作成 | btnCreate | True (デフォルト) |
2 | DataTable の保存 | btnSave | False |
3 | DataTable の読み込み | btnLoad | False |
4 | 圧縮された DataTable の読み込み | btnLoadCompressed | False |
ソリューションエクスプローラウィンドウに移動し、[すべてのファイルを表示]ボタンをクリックします。[参照]を右クリックし、[参照の追加]メニューオプションを選択します。リストから C1.C1Zip アセンブリを選択するか、ファイルを参照して C1.C1Zip.2.dll ファイルを探します。
[Form1.vb]タブ(C# では[Form1.cs]タブ)を選択するか、[表示]→[コード]を選択して、コードエディタを開きます。ファイルの上部に、次のステートメントを追加します。
Visual Basic でコードを書く場合
Visual Basic |
コードのコピー
|
---|---|
Imports System.IO Imports System.Data.OleDb Imports System.Runtime.Serialization.Formatters.Binary Imports C1.C1Zip |
C# でコードを書く場合
C# |
コードのコピー
|
---|---|
using System.IO; using System.Data.OleDb; using System.Runtime.Serialization.Formatters.Binary; using C1.C1Zip; |
これで、プロジェクト内で使用されるクラスの名前空間が宣言されます。
フォームのコードエディタで、フォーム実装の本体に、次の行を入力するかコピーします。
Visual Basic でコードを書く場合
Visual Basic |
コードのコピー
|
---|---|
Private Const FN_REGULAR = "\DataTable.regular" Private Const FN_COMPRESSED = "\DataTable.compressed" Private Const MDBFILE = " C:\Users\Documents\ComponentOne Samples\Common\C1NWIND.MDB" |
C# でコードを書く場合
C# |
コードのコピー
|
---|---|
private const string FN_REGULAR = @"\DataTable.regular"; private const string FN_COMPRESSED = @"\DataTable.compressed"; private const string MDBFILE = @"C:\Users\Documents\ComponentOne Samples\Common\C1NWIND.MDB"; |
これらの定数は、データテーブルへの入力時に使用されるデータベースの名前、およびデータのシリアライズに使用されるファイルの名前を定義します。
[データテーブルの作成]ボタンの Click イベントを処理する次のコードを追加します。
Visual Basic でコードを書く場合
Visual Basic |
コードのコピー
|
---|---|
Private Sub btnCreate_Click(sender As Object,e As EventArgs) Handles btnCreate.Click ' テーブルを開きます。 Dim conn As String conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & MDBFILE & ";" Dim rs As String = "select * from customers" ' ステータスを表示します。 Cursor = Cursors.WaitCursor ToolStripStatusLabel1.Text = "Loading data from mdb file..." ' データをロードします。 Dim da As OleDbDataAdapter = New OleDbDataAdapter(rs, conn) Dim ds As DataSet = New DataSet() Try da.Fill(ds) Catch MessageBox.Show("Could not load data from " + MDBFILE) End Try ' ステータスを表示します。 Cursor = Cursors.Default ToolStripStatusLabel1.Text = "Loaded " & ds.Tables(0).Rows.Count & " records from mdb file." ' グリッドに連結します。 DataGridView1.DataSource = ds.Tables(0) ' 保存ボタンを有効化します。 btnSave.Enabled = True End Sub |
C# でコードを書く場合
C# |
コードのコピー
|
---|---|
private void btnCreate_Click(object sender,EventArgs e) { // テーブルを開きます。 string conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDBFILE + ";"; string rs = "select * from customers"; // ステータスを表示します。 Cursor = Cursors.WaitCursor; toolStripStatusLabel1.Text = "Loading data from mdb file..."; // データをロードします。 OleDbDataAdapter da = new OleDbDataAdapter(rs, conn); DataSet ds = new DataSet(); try { da.Fill(ds); } catch { MessageBox.Show("Could not load data from " + MDBFILE); } // ステータスを表示します。 Cursor = Cursors.Default; toolStripStatusLabel1.Text = "Loaded " + ds.Tables[0].Rows.Count + " records from mdb file."; // グリッドに連結します。 dataGridView1.DataSource = ds.Tables[0]; // 保存ボタンを有効化します。 btnSave.Enabled = true; } |
この関数は、標準の ADO.NET オブジェクトとメソッドを使用して、DataTable オブジェクトを作成し、このオブジェクトにデータを入力します。このオブジェクトは、次に DataGrid コントロールに連結されます。
[データテーブルの保存]ボタンの Click イベントを処理する次のコードを追加します。
Visual Basic でコードを書く場合
Visual Basic |
コードのコピー
|
---|---|
Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click ' グリッドからデータテーブルを取得します。 Dim dt As DataTable = DataGridView1.DataSource ' ステータスを表示します。 Cursor = Cursors.WaitCursor ToolStripStatusLabel1.Text = "Serializing data to regular file..." ' データセットを通常のファイルにシリアライズします。 Dim fn As String = Application.StartupPath + FN_REGULAR Dim fs As FileStream = New FileStream(fn, FileMode.Create) Dim bf As BinaryFormatter = New BinaryFormatter() bf.Serialize(fs, dt) Dim lenRegular As Long = fs.Length fs.Close() ' ステータスを表示します。 Cursor = Cursors.WaitCursor ToolStripStatusLabel1.Text = "Serializing data to compressed file..." ' データセットを圧縮ファイルにシリアライズします。 fn = Application.StartupPath & FN_COMPRESSED fs = New FileStream(fn, FileMode.Create) Dim compressor As C1ZStreamWriter = New C1ZStreamWriter(fs) bf = New BinaryFormatter() bf.Serialize(compressor, dt) Dim lenCompressed As Long = fs.Length fs.Close() ' ステータスを表示します。 Cursor = Cursors.Default ToolStripStatusLabel1.Text = string.Format( "Saved to regular file ({0:#,###} bytes) and " & "compressed file ({1:#,###} bytes)", lenRegular, lenCompressed) ' ロードボタンを有効化します。 btnLoad.Enabled = True btnLoadCompressed.Enabled = True End Sub |
C# でコードを書く場合
C# |
コードのコピー
|
---|---|
private void btnSave_Click(object sender, EventArgs e) { // グリッドからデータテーブルを取得します。 DataTable dt = (DataTable)dataGridView1.DataSource; // ステータスを表示します。 Cursor = Cursors.WaitCursor; toolStripStatusLabel1.Text = "Serializing data to regular file..."; // データセットを通常のファイルにシリアライズします。 string fn = Application.StartupPath + FN_REGULAR; FileStream fs = new FileStream(fn, FileMode.Create); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, dt); long lenRegular = fs.Length; fs.Close(); // ステータスを表示します。 Cursor = Cursors.WaitCursor; toolStripStatusLabel1.Text = "Serializing data to compressed file..."; // データセットを圧縮ファイルにシリアライズします。 fn = Application.StartupPath + FN_COMPRESSED; fs = new FileStream(fn, FileMode.Create); C1ZStreamWriter compressor = new C1ZStreamWriter(fs); bf = new BinaryFormatter(); bf.Serialize(compressor, dt); long lenCompressed = fs.Length; fs.Close(); // ステータスを表示します。 Cursor = Cursors.Default; toolStripStatusLabel1.Text = string.Format("Saved to regular file ({0:#,###} bytes) and " + "compressed file ({1:#,###} bytes)", lenRegular, lenCompressed); // ロードボタンを有効化します。 btnLoad.Enabled = true; btnLoadCompressed.Enabled = true; } |
最初のコードセットは、DataTable を通常のファイルにシリアライズします。2番目のコードセットは、DataTable を圧縮ファイルにシリアライズします。1行のコードを追加するだけで、データを圧縮することができます。
どちらの場合も、シリアライズは BinaryFormatter オブジェクトによって実行されます。唯一の違いは、最初のコードセットでは Serialize メソッドが通常のファイルストリームをパラメータとして呼び出され、2番目のコードセットでは代わりに C1ZStreamWriter が使用されるという点です。
[データテーブルのロード]ボタンの Click イベントを処理する次のコードを追加します。
Visual Basic でコードを書く場合
Visual Basic |
コードのコピー
|
---|---|
Private Sub btnLoad_Click(sender As Object, e As EventArgs) Handles btnLoad.Click ' グリッドをクリアし、ステータスを表示します。 Cursor = Cursors.WaitCursor DataGridView1.DataSource = Nothing ToolStripStatusLabel1.Text = "Loading from regular file..." ' 通常のファイルからシリアライズ解除します。 Dim fn As String = Application.StartupPath & FN_REGULAR Dim fs As FileStream = New FileStream(fn, FileMode.Open) Dim ticks As Long = DateTime.Now.Ticks Dim bf As BinaryFormatter = New BinaryFormatter() Dim dt As DataTable = bf.Deserialize(fs) Dim ms As Long = (DateTime.Now.Ticks - ticks) / TimeSpan.TicksPerMillisecond fs.Close() ' 結果を表示します。 Cursor = Cursors.Default DataGridView1.DataSource = dt ToolStripStatusLabel1.Text = "Loaded from regular file in " & ms.ToString() & " ms." End Sub |
C# でコードを書く場合
C# |
コードのコピー
|
---|---|
private void btnLoad_Click(object sender, EventArgs e) { // グリッドをクリアし、ステータスを表示します。 Cursor = Cursors.WaitCursor; dataGridView1.DataSource = null; toolStripStatusLabel1.Text = "Loading from regular file..."; // 通常のファイルからシリアライズ解除します。 string fn = Application.StartupPath + FN_REGULAR; FileStream fs = new FileStream(fn, FileMode.Open); long ticks = DateTime.Now.Ticks; BinaryFormatter bf = new BinaryFormatter(); DataTable dt = (DataTable)bf.Deserialize(fs); long ms = (DateTime.Now.Ticks - ticks) / TimeSpan.TicksPerMillisecond; fs.Close(); // 結果を表示します。 Cursor = Cursors.Default; dataGridView1.DataSource = dt; toolStripStatusLabel1.Text = "Loaded from regular file in " + ms.ToString() + " ms."; } |
最初に重要な行は新しい BinaryFormatter オブジェクトの作成、次に重要な行はその Deserialize メソッドの呼び出しです。この Deserialize メソッドはパラメータを1つ受け取ります。それは、オブジェクトが定義されたストリームです。この場合、ストリームは通常のファイルストリームです。
[圧縮データテーブルのロード]ボタンの Click イベントを処理する次のコードを追加します。
Visual Basic でコードを書く場合
Visual Basic |
コードのコピー
|
---|---|
Private Sub btnLoadCompressed_Click(sender As Object, e As EventArgs) Handles btnLoadCompressed.Click ' グリッドをクリアし、ステータスを表示します。 Cursor = Cursors.WaitCursor DataGridView1.DataSource = Nothing ToolStripStatusLabel1.Text = "Loading from compressed file..." ' 圧縮ファイルからシリアライズ解除します。 Dim fn As String = Application.StartupPath + FN_COMPRESSED Dim fs As FileStream = New FileStream(fn, FileMode.Open) Dim ticks As Long = DateTime.Now.Ticks Dim decompressor As C1ZstreamReader decompressor = New C1ZStreamReader(fs) Dim bf As BinaryFormatter = New BinaryFormatter() Dim dt As DataTable = bf.Deserialize(decompressor) Dim ms As Long = (DateTime.Now.Ticks - ticks) / TimeSpan.TicksPerMillisecond fs.Close() ' 結果を表示します。 Cursor = Cursors.Default DataGridView1.DataSource = dt ToolStripStatusLabel1.Text = "Loaded from compressed file in " & ms.ToString() & " ms." End Sub |
C# でコードを書く場合
C# |
コードのコピー
|
---|---|
private void btnLoadCompressed_Click(object sender, EventArgs e) { // グリッドをクリアし、ステータスを表示します。 Cursor = Cursors.WaitCursor; dataGridView1.DataSource = null; toolStripStatusLabel1.Text = "Loading from compressed file..."; // 圧縮ファイルからシリアライズ解除します。 string fn = Application.StartupPath + FN_COMPRESSED; FileStream fs = new FileStream(fn, FileMode.Open); long ticks = DateTime.Now.Ticks; C1ZStreamReader decompressor; decompressor = new C1ZStreamReader(fs); BinaryFormatter bf = new BinaryFormatter(); DataTable dt = (DataTable)bf.Deserialize(decompressor); long ms = (DateTime.Now.Ticks - ticks) / TimeSpan.TicksPerMillisecond; fs.Close(); // 結果を表示します。 Cursor = Cursors.Default; dataGridView1.DataSource = dt; toolStripStatusLabel1.Text = "Loaded from compressed file in " + ms.ToString() + " ms."; } |
重要な行は、通常のファイルからデータをシリアライズ解除するコードと同じです。唯一の違いは、Deserialize メソッドに通常のファイルストリームを渡す代わりに、C1ZStreamReader オブジェクトを使用すると点です。
これで、「圧縮シリアライズ」チュートリアルは終了です。