是的,我以前用过。我将DataSet 子类化一次以支持将自身持久化到文件中(通过ReadXML/WriteXML 方法)。作为一个额外的奖励,我决定允许它在需要时进行可选压缩(正如你们都应该知道的,这对于像 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);
}