はい、過去に使用しました。( ReadXML / WriteXMLメソッドを介して)ファイルへの永続化をサポートするために、DataSetを1回サブクラス化しました。追加のボーナスとして、必要に応じて、オプションで圧縮できるようにすることにしました(これは、ご存知のとおり、XMLなどのテキストデータで非常に効果的です)。
私はGZipStreamクラスを使用しました(関連するDeflateStreamはヘッダー情報などのないGZipであるとのことでしたが、誰かがこれを修正できると確信しています)。別のストリームの上にピギーバックするだけで非常に簡単に機能するため、代わりにGZipStreamを使用します。私の場合、それはFileStreamに便乗していました。
の出力で満たされるMemoryStreamが与えられた場合myDataSet.WriteXML()
、私は次のようなことをしました。
if (CompressData)
{
// Write to memory
mStream = new MemoryStream();
Save(mStream);
mStream.Seek(0, SeekOrigin.Begin);
// Filter that through a GZipStream and then to file
fStream = new FileStream(Path.Combine(CacheFilePath, FileName + ".gz"),
FileMode.OpenOrCreate);
zipStream = new GZipStream(fStream, CompressionMode.Compress, true);
Pump(mStream, zipStream);
}
else
{
// Write straight to file
fStream = new FileStream(Path.Combine(CacheFilePath, FileName),
FileMode.OpenOrCreate);
Save(fStream);
}
ここSave()
で、Pump()
は次のような単純な方法です。
private void Pump(Stream input, Stream output)
{
int n;
byte[] bytes = new byte[4096]; // 4KiB at a time
while ((n = input.Read(bytes, 0, bytes.Length)) != 0)
{
output.Write(bytes, 0, n);
}
}
public void Save(Stream stream)
{
AcceptChanges();
WriteXml(stream, XmlWriteMode.WriteSchema);
}