Да, я использовал это в прошлом. Я подклассифицировал 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);
}