Разве у вашего формата файла нет заголовка?Если нет, то сейчас - это время для его добавления (в любом случае вы меняете формат файла, поддерживая сжатие).Выберите хорошее магическое значение , убедитесь, что заголовок расширяемый (добавьте поле версии или используйте специальные магические значения для определенных версий), и вы готовы к работе.
После загрузкипроверьте магическое значение.Если нет, используйте ваши текущие стандартные процедуры загрузки.Если он присутствует, заголовок скажет вам, сжато ли содержимое.
Обновить
Сжатие потока означает, что файл больше не является документом XML, и, таким образом,нет особых оснований ожидать, что файл не может содержать больше, чем ваши данные stream .Вы действительно хотите заголовок, идентифицирующий ваш файл:)
Ниже приведен пример (псевдо) -кода;Я не знаю, если .net имеет «подпоток», SubRangeStream, скорее всего, вам придется самому кодировать (DeflateStream, вероятно, добавляет свой собственный заголовок, поэтому подпоток может не понадобиться; может оказаться полезным в дальнейшем,хотя).
Int64 oldPosition = reader.Position;
reader.Read(magic, 0, magic.length);
if(IsRightMagicValue(magic))
{
Header header = ReadHeader(reader);
Stream furtherReader = new SubRangeStream(reader, reader.Position, header.ContentLength);
if(header.IsCompressed)
{
furtherReader = new DeflateStream(furtherReader, CompressionMode.Decompress);
}
XmlSerializer xml = new XmlSerializer(typeof(Workspace));
workspace = (Workspace) xml.Deserialize(furtherReader);
} else
{
reader.Position = oldPosition;
LegacyLoad(reader);
}
В реальной жизни я бы поступил немного иначе - например, путем некоторой правильной обработки ошибок и их очистки.Кроме того, у меня не было бы нового кода загрузчика непосредственно в блоке IsRightMagicValue
, а скорее я бы выделил работу либо на основе магического значения (одно магическое значение на версию файла), либо я бы оставил «общий»заголовок "порция с полями, общими для всех версий.Для обоих я бы использовал Factory Method , чтобы вернуть IWorkspaceReader
в зависимости от версии файла.