Как мне сжать объект [] [] в C # - PullRequest
2 голосов
/ 08 августа 2011

Мне нужно сжать объект [] [] в C #. Я могу использовать Gzip comrepss - распаковать байт [], но как это сделать в таких случаях?

Ответы [ 2 ]

3 голосов
/ 08 августа 2011

Используйте двоичную сериализацию, чтобы превратить ее в байтовый массив, который вы затем архивируете.При условии, что все объекты в массиве являются сериализуемыми, вы можете сделать следующее

object[][] objects = new[] {new[] {"a"}};
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream memoryStream = new MemoryStream())
using (GZipStream gZipStream = new GZipStream(File.OpenWrite("C:\\zipped.zip"), 
    CompressionMode.Compress))
{
    formatter.Serialize(gZipStream, objects);
}

//unzipping
using (GZipStream gZipStream = new GZipStream(File.OpenRead("C:\\zipped.zip"), 
    CompressionMode.Decompress))
{
    objects = (object[][])formatter.Deserialize(gZipStream);
    Console.WriteLine(objects[0][0]); //a
}
2 голосов
/ 08 августа 2011
  1. Преобразование object[][] в byte[]
  2. Сжатие byte[]

Шаг 1 является сложной частью и потребует, чтобы все ваши объектыявляются сериализуемыми, так что они могут быть преобразованы в byte[] s.

Причина, по которой это сложно, состоит в том, что содержимое object[] на самом деле просто ссылки на память на различные object s в памяти, иэти object могут также иметь ссылки на другие object s.Некоторые могут даже ссылаться на определенные системные ресурсы, такие как порты ввода / вывода, которые были им выделены.Не имеет смысла отправлять подобный объект на другой компьютер, потому что этот компьютер не предоставил объекту одинаковые ресурсы, верно?Поэтому, если классы специально не указали, что они могут быть сериализованы и десериализованы в поток байтов, вы ничего не можете с ними сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...