Сериализация в .NET. Выпрямляем своими руками
От: Владислав Чистяков Российская Империя www.nemerle.org
Дата: 24.08.03 12:02
Оценка: 351 (12) +1 -1
Статья:
Сериализация в .NET. Выпрямляем своими руками
Автор(ы): Владислав Чистяков
Дата: 02.09.2003
В статье приводятся тесты скорости сериализации и объема сериализованных данных при применении автоматической сериализации в .NET. Обсуждаются варианты исправления ситуации. В качестве примера приводится вариант ручной сериализации для объектов DataSet и DataTable.


Авторы:
Владислав Чистяков

Аннотация:
В статье приводятся тесты скорости сериализации и объема сериализованных данных при применении автоматической сериализации в .NET. Обсуждаются варианты исправления ситуации. В качестве примера приводится вариант ручной сериализации для объектов DataSet и DataTable.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Сериализация в .NET. Выпрямляем своими руками
От: AndrewG  
Дата: 27.08.03 04:00
Оценка:
Разнес сериализацию/десереализацию на сервер и клиент.
Получил увеличенное время десереализации по сравнению с тестовой программой.

На моих данных в тестовой программе было ~ 2.8 сек, на клиенте получил ~ 4.5

Код на клиенте:
Int32 arLen = 0;
byte[] ar = MyRemoteObject.GetData(ref arLen);

byte[] arUnZip = new byte[arLen];
ZipBase.Uncompress(arUnZip, ar);

MemoryStream ms = new MemoryStream(arUnZip);

timer.Start();
DataSet dsLoaded = DataSerializer.DeserializeDataSet(ms);
Console.WriteLine("Deserialization time:{0,5:##0.0000}",timer.Finis());

С чем это может быть связано?
Re[2]: Сериализация в .NET. Выпрямляем своими руками
От: Hacker_Delphi Россия  
Дата: 27.08.03 04:40
Оценка:
Здравствуйте, AndrewG, Вы писали:

AG>С чем это может быть связано?


Маршалинг... и ничего с этим не сделаешь.... причем это время слабо зависит (вроде) от того, чем пользуешься ( CORBA/COM+/DCOM/.Net Remoting)... у меня та же окрошка... на каждый Remoting вызов с возвратом максимум 100 байт тратится от 50 до 100 милисекунд... добавил в один из Remoting объектов
... << RSDN@Home 1.1 alpha 1 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[3]: Сериализация в .NET. Выпрямляем своими руками
От: AndrewG  
Дата: 27.08.03 04:56
Оценка:
Я писал не о времени получения данных по сети,
а о времени десереализации ЛОКАЛЬНОГО СТРИМА!
см. код
Re[2]: Сериализация в .NET. Выпрямляем своими руками
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.08.03 02:17
Оценка:
Здравствуйте, AndrewG, Вы писали:

AG>Разнес сериализацию/десереализацию на сервер и клиент.

AG>Получил увеличенное время десереализации по сравнению с тестовой программой.

AG>На моих данных в тестовой программе было ~ 2.8 сек, на клиенте получил ~ 4.5


Дык а процессоры то какие на машинах?

AG>С чем это может быть связано?


Нужно сравнить с общем временем передачи по сети. Возможно что-то работало в бэкграунде.

Тут вообще есть смысл сравнить общую скорость передачи данных разными форматерами по сети. Потому, как кроме скорости сериализации будет еще фактор вреемени передачи данных. И он может оказаться куда более весомым.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Сериализация в .NET. Выпрямляем своими руками
От: Nivedano Беларусь  
Дата: 08.09.03 13:10
Оценка: 10 (1)
Здравствуйте, Владислав Чистяков, Вы писали:

ВЧ>Статья:

ВЧ>Сериализация в .NET. Выпрямляем своими руками

Я тоже делал похожие тесты, только, слегка по-другому. Написан собственный бинарный сериалайзер, без особых наворотов типа сериализации MarshalByRef или ISerializable, но графы любой сложности обрабатывает корректно. Так вот после алгоритмической оптимизации (даже без ngen-a) на Framework 1.0 он обгонял стандартный BinaryFormatter в 3-4 раза. После перехода на 1.1 ситуация изменилась, но не кардинально. Ниже результаты в миллисекундах, пишем/читаем один и тот же граф из N-ного числа объектов. С ростом числа объектов отставание стандартного соответственно увеличивается. Про SOAP и XML и говорить не стоит.

Число объектов Собственный CLR STD
~1000 150/160 230/160
~5000 580/851 901/1151
~10000 1412/1632 1912/2734

Размер потоков тоже меньше:

Число объектов Собственный CLR STD
~1000 142053 221380
~5000 715160 1110487
~10000 1436164 2226491

А потом переписали его на Java и ща гоняем объеты в бинарном виде из CLR в JRE без всяких SOAP с XML.
Кого интересует опыт, свистите на knots@tut.by
Re[2]: Сериализация в .NET. Выпрямляем своими руками
От: alex2808 Украина  
Дата: 17.12.04 07:54
Оценка:
Всем привет...
Ребята, нашел эту статью...
Хотелось бы попробовать самому...
Не поделитесь инфой, где можно взять библиотеки архивации (ZLIB и SharpZipLib)...
Может кто-то поделиться...
По ссылке в статье я их не нашел.

Если у кого сохранились, скиньте на мыло alex2808@mail.ru

Или ссылку, где их можно прокачать.

Зеранее благодарен.
Всех благ
Re[3]: Сериализация в .NET. Выпрямляем своими руками
От: Andrbig  
Дата: 17.12.04 08:51
Оценка: 10 (1) :)
Здравствуйте, alex2808, Вы писали:

A>Не поделитесь инфой, где можно взять библиотеки архивации (ZLIB и SharpZipLib)...


Ты не поверишь! www.ZLIB.net!

SharpZipLib ищи в гугле.
Re[4]: Сериализация в .NET. Выпрямляем своими руками
От: alex2808 Украина  
Дата: 17.12.04 09:07
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>Ты не поверишь! www.ZLIB.net!

A>SharpZipLib ищи в гугле.

Спасибо...
Меня интересует в МС++ обертке
Что-бы можно было в NET использовать...
Как в примерах...

Где взять?
Всех благ
Re: Сериализация в .NET. Выпрямляем своими руками
От: Юнусов Булат Россия  
Дата: 17.12.04 10:12
Оценка:
Здравствуйте, Владислав Чистяков, Вы писали:

А надо ли гонять по сетке датасет или дататаблу именно в виде хмля?
Это чтобы все могли на данные глядеть чтоли? А оно надо?
Имхо куда сподручнее в виде закомпрессованного (плюс опционально зашифрованного) массива байт гонять — и батлнек ширше и враги ничего не поймуть.


using System.IO;
using System.Data;
using ICSharpCode.SharpZipLib.GZip;

namespace Sior.Data.Compression
{
    public class GZipper
    {
        public static byte[] GetBytes(DataSet ds)
        {
            if (null != ds)
            {
                MemoryStream ms = new MemoryStream();
                
                ds.WriteXml(ms);
                ms.Seek(0, SeekOrigin.Begin);
                return ms.ToArray();
                
            }
            return null;
        }

        public static byte[] CompressBytes(byte[] data)
        {
            if (null != data)
            {
                MemoryStream ms = new MemoryStream();
                Stream s = new GZipOutputStream(ms);
                s.Write(data, 0, data.Length);
                s.Flush();
                s.Close();
                return ms.ToArray();
            }
            return null;
        }

        public static byte[] CompressDataSet(DataSet ds)
        {
            return CompressBytes(GetBytes(ds));
        }

        public static byte[] DecompressBytes(byte[] data)
        {
            if (null != data)
            {
                MemoryStream compressedStream = new MemoryStream(data);
                Stream s = new GZipInputStream(compressedStream);
                
                int size = 2048;
                byte[] writeData = new byte[size];

                MemoryStream decompressedStream = new MemoryStream();
                while (true)
                {
                    size = s.Read(writeData, 0, size);
                    if (size > 0)
                    {
                        decompressedStream.Write(writeData, 0, size);
                    }
                    else
                    {
                        break;
                    }
                }
                s.Flush();
                s.Close();
                decompressedStream.Seek(0, SeekOrigin.Begin);
                return decompressedStream.ToArray();
            }
            
            return null;
        }


        public static Sior.Data.DataSetMessages GetDataSetMessages(byte[] data)
        {
            if (null != data)
            {
                MemoryStream ms = new MemoryStream(data);
                
                Sior.Data.DataSetMessages ds = new Sior.Data.DataSetMessages();
                ms.Seek(0, SeekOrigin.Begin);
                ds.ReadXml(ms);
                ds.AcceptChanges();
                return ds;
                
            }
            return null;
        }


        public static Sior.Data.DataSetMessages DecompressDataSetMessages(byte[] data)
        {
            return GetDataSetMessages(DecompressBytes(data));
        }
Re[5]: Сериализация в .NET. Выпрямляем своими руками
От: Andrbig  
Дата: 17.12.04 10:50
Оценка:
Здравствуйте, alex2808, Вы писали:

A>Меня интересует в МС++ обертке

A>Что-бы можно было в NET использовать...
A>Как в примерах...

A>Где взять?


Я бы и сам не прочь взглянуть на это дело... Может спросить у автора? Ау, VladD2, не поделишься?
Re[2]: Сериализация в .NET. Выпрямляем своими руками
От: alex2808 Украина  
Дата: 17.12.04 10:53
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

Булат.. А можно полную версию класса на мыло alex2808@mail.ru?
Всех благ
Re[3]: Сериализация в .NET. Выпрямляем своими руками
От: Юнусов Булат Россия  
Дата: 17.12.04 11:14
Оценка:
Здравствуйте, alex2808, Вы писали:

A>Булат.. А можно полную версию класса на мыло alex2808@mail.ru?


А оно полное на экране и есть.
Просто использование http://www.icsharpcode.net/OpenSource/SharpZipLib/ для перевода датасета в компрессованный массив и обратно.
Re[4]: Сериализация в .NET. Выпрямляем своими руками
От: alex2808 Украина  
Дата: 17.12.04 11:25
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

А что это за тип данных Sior.Data.DataSetMessages, которые возвращают методы...

В твоей реализации после

        public static Sior.Data.DataSetMessages DecompressDataSetMessages(byte[] data)
        {
            return GetDataSetMessages(DecompressBytes(data));
        }


класс заканчивается?
Всех благ
Re[5]: Сериализация в .NET. Выпрямляем своими руками
От: Юнусов Булат Россия  
Дата: 17.12.04 11:37
Оценка:
Здравствуйте, alex2808, Вы писали:

A>А что это за тип данных Sior.Data.DataSetMessages, которые возвращают методы...


Это не из класса, это пример как достать типизованный датасет их компрессованного массива байт.
Re[6]: Сериализация в .NET. Выпрямляем своими руками
От: alex2808 Украина  
Дата: 17.12.04 12:23
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>Здравствуйте, alex2808, Вы писали:


A>>А что это за тип данных Sior.Data.DataSetMessages, которые возвращают методы...


ЮБ>Это не из класса, это пример как достать типизованный датасет их компрессованного массива байт.




Sior.Data.DataSetMessages: я понял, что это отдельный класс, наверное обертка для DataSet с функционалом. Где можно увидить его реализацию, это твой класс или из какого-то пакета?
Всех благ
Re[7]: Сериализация в .NET. Выпрямляем своими руками
От: Юнусов Булат Россия  
Дата: 17.12.04 12:29
Оценка:
Здравствуйте, alex2808, Вы писали:

A>Sior.Data.DataSetMessages: я понял, что это отдельный класс, наверное обертка для DataSet с функционалом. Где можно увидить его реализацию, это твой класс или из какого-то пакета?


Сатый обыкновенный типизованый датасет
Re[2]: Сериализация в .NET. Выпрямляем своими руками
От: Mika Soukhov Stock#
Дата: 17.12.04 13:05
Оценка: -1
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>Здравствуйте, Владислав Чистяков, Вы писали:


ЮБ>А надо ли гонять по сетке датасет или дататаблу именно в виде хмля?

ЮБ>Это чтобы все могли на данные глядеть чтоли? А оно надо?

Лучше всего гонять именно в таком виде. Сериализация должна знать лишь о типе, но никак не о алгоритмах модификации. Если нужно шифрование или сжатие, то нужно брать подходящее соединение.
Re[3]: Сериализация в .NET. Выпрямляем своими руками
От: Аноним  
Дата: 17.12.04 13:54
Оценка: +1
Здравствуйте, Mika Soukhov, Вы писали:

ЮБ>>А надо ли гонять по сетке датасет или дататаблу именно в виде хмля?


MS>Лучше всего гонять именно в таком виде. Сериализация должна знать лишь о типе, но никак не о алгоритмах модификации. Если нужно шифрование или сжатие, то нужно брать подходящее соединение.



Чем лучше ? "Чем грузины"?
Re[3]: Сериализация в .NET. Выпрямляем своими руками
От: Юнусов Булат Россия  
Дата: 17.12.04 14:04
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

ЮБ>>А надо ли гонять по сетке датасет или дататаблу именно в виде хмля?

ЮБ>>Это чтобы все могли на данные глядеть чтоли? А оно надо?

MS>Лучше всего гонять именно в таком виде.

Почему? Голословно.

MS>Сериализация должна знать лишь о типе, но никак не о алгоритмах модификации.

Как будто в моем коде серилизация что то знает. Знаю я, и этого достаточно.

MS>Если нужно шифрование или сжатие, то нужно брать подходящее соединение.

Вариантов куча, выбирай что хошь.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.