Zip for .NET
圧縮されたシリアル化
Zip for.Netチュートリアル > 圧縮されたシリアル化

このチュートリアルでは、オブジェクトを圧縮ファイルにシリアライズする方法、およびそのオブジェクトをメモリにロードする方法について説明します。

この例では、NorthWind データベースを使用してデータテーブルを作成します。テーブルは、通常のストリームと圧縮ストリームに保存(シリアライズ)されます。最後に、どちらかのストリームからデータがロードされます。最終アプリケーションは、次の図のように表示されます。


手順1:メインフォームを作成します

新しい Visual Studio プロジェクトを開始し、ツールボックスからフォームに次のコントロールを追加します。

手順2:参照と Imports ステートメントを追加します

ソリューションエクスプローラウィンドウに移動し、[すべてのファイルを表示]ボタンをクリックします。[参照]を右クリックし、[参照の追加]メニューオプションを選択します。リストから 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;

これで、プロジェクト内で使用されるクラスの名前空間が宣言されます。

手順3:定数を宣言します

フォームのコードエディタで、フォーム実装の本体に、次の行を入力するかコピーします。

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

これらの定数は、データテーブルへの入力時に使用されるデータベースの名前、およびデータのシリアライズに使用されるファイルの名前を定義します。

手順4:データテーブルを作成するコードを追加します

データテーブルの作成]ボタンの 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 コントロールに連結されます。

手順5:データテーブルを保存するコードを追加します

データテーブルの保存]ボタンの 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 が使用されるという点です。

手順6:通常のファイルからデータテーブルをロードするコードを追加します

データテーブルのロード]ボタンの 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つ受け取ります。それは、オブジェクトが定義されたストリームです。この場合、ストリームは通常のファイルストリームです。

手順7: 圧縮ファイルからデータテーブルをロードするコードを追加します。

圧縮データテーブルのロード]ボタンの 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 オブジェクトを使用すると点です。

これで、「圧縮シリアライズ」チュートリアルは終了です。