Скажем, у меня есть объект с именем data
, который содержит различную информацию. Допустим, для аргумента, что на графике data
действительно много вещей.
Если я сериализую его, используя BinaryFormatter
, я получу файл, скажем, 5Mb.
Если я инкапсулирую поток сериализации в GZipStream
, то получу гораздо меньший файл, скажем, 1Mb.
Я могу, если захочу, зашифровать поток при его сжатии или зашифровать поток без его сжатия.
Проблема в том, что мне нужно знать, что было сделано во время сериализации, чтобы я знал, что делать, когда я его десериализовал.
Один из методов - использовать другое расширение файла. Например, несжатый незашифрованный файл может иметь расширение .dat, .zdat для сжатого, .cdat для зашифрованного и .czdat для сжатого и зашифрованного.
Это будет работать, но это создает потенциальную проблему: что, если пользователь изменяет расширение, и т. Д. Это также означает, что если я хочу связать файлы в Windows, есть 4 расширения вместо 1, которые необходимо связать - четырехкратный риск столкновения с существующими ассоциациями.
Если я заверну свой объект данных в простой класс:
[Serializable]
public class SerialisationContainer
{
public string SerialisedData { get; private set; }
public bool Compressed { get; private set; }
public bool Encrypted { get; private set; }
public SerialisationContainer()
{
// etc...
}
public object GetObject()
{
// etc...
}
}
тогда я в основном сериализую объект, в котором есть сериализованный поток, который может быть сжат и / или зашифрован, но мы не знаем или не заботимся об этом, потому что мета-информация хранится в SerialisationContainer
.
Что ты думаешь? Мне просто любопытно, что вы думаете об этом методе и что вы делаете в подобных ситуациях. Я думаю, что вышеупомянутый метод - очень расточительный способ делать то, что я хочу. В основном мне нужно было бы сериализовать мой граф данных в поток памяти, преобразовать его в строку, поместить строку в мой контейнер, а затем снова сериализовать.
Другой проблемой является длина string SerialisedData
. В примере, который я привел, у нас есть только около 5 ГБ BinaryData, но как насчет того, когда он начинает увеличиваться? Я знаю, что верхняя граница для string
в 64-битной ОС составляет около 2 ГБ и значительно меньше для 32-битной ОС. Есть ли у потоков такое ограничение? Поскольку потоки записываются в байтовых блоках, имеет смысл, что они не будут.