このチュートリアルでは、オブジェクトを圧縮ファイルにシリアライズする方法、およびそのオブジェクトをメモリにロードする方法について説明します。
この例では、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 オブジェクトを使用すると点です。
これで、「圧縮シリアライズ」チュートリアルは終了です。