Получить байт [] из набора данных и сжать - PullRequest
4 голосов
/ 14 января 2011

Я возвращаю пользовательский класс из операции WCF. Используется привязка netTcp. Этот пользовательский класс содержит несколько элементов данных. Одним из них является набор данных. Набор данных может быть огромным в зависимости от конкретных действий. Я планирую сжать набор данных в байты, а затем вернуть пользовательский класс обратно.

Основываясь на чтении, я разработал следующий код для возврата сжатых байтов из набора данных Но не уверен, что это лучший (или правильный) путь. Ваши мысли, пожалуйста. ??

            byte[] bytes = null;
            byte[] compressedBytes = null;
            using(var memory = new MemoryStream())
            {
                var formatter = new BinaryFormatter();
                formatter.Serialize(memory, ds);
                bytes = memory.ToArray();
            }

            using(var memory = new MemoryStream())
            {
                using(var gzip = new GZipStream(memory, CompressionMode.Compress, true))
                {
                    gzip.Write(bytes, 0, bytes.Length);
                    compressedBytes = memory.ToArray();
                }
            }

            return compressedBytes;    

Ответы [ 2 ]

4 голосов
/ 14 января 2011

Существует важный шаг для экономии места:

ds.RemotingFormat = SerializationFormat.Binary;

В противном случае он внутренне использует xml, даже через BinaryFormatter.Имея это в виду, вы также можете включить gzip, но выигрыш не будет вполне значительным.Так получилось, что у меня есть статистика для сравнения здесь ;скопировать эти данные в:

DataTable (xml) (vanilla)               2269ms/6039ms
                                       64,150,771 bytes
DataTable (xml) (gzip)                  4881ms/6714ms
                                       7,136,821 bytes
DataTable (xml) (deflate)               4475ms/6351ms
                                       7,136,803 bytes
BinaryFormatter (rf:binary) (vanilla)   2006ms/3366ms
                                       11,272,592 bytes
BinaryFormatter (rf:binary) (gzip)      3332ms/4267ms
                                       8,265,057 bytes
BinaryFormatter (rf:binary) (deflate)   3216ms/4130ms

Но: DataSet - это , а не - это очень WCF-способ ведения дел.Я бы добавил стандартные классы ОО и поменял сериализатор на что-то вроде protobuf-net , которое на значительно меньше , чем DataContractSerializer или NetDataContractSerializer.

3 голосов
/ 14 января 2011

Вы можете просто использовать следующее:

        using(var memory = new MemoryStream())
        {
            using(var gzip = new GZipStream(memory, CompressionMode.Compress, true))
            {
                var formatter = new BinaryFormatter();
                formatter.Serialize(gzip, ds);
            }

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