Аннотация:
В статье приводятся тесты скорости сериализации и объема сериализованных данных при применении автоматической сериализации в .NET. Обсуждаются варианты исправления ситуации. В качестве примера приводится вариант ручной сериализации для объектов DataSet и DataTable.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewG, Вы писали:
AG>С чем это может быть связано?
Маршалинг... и ничего с этим не сделаешь.... причем это время слабо зависит (вроде) от того, чем пользуешься ( CORBA/COM+/DCOM/.Net Remoting)... у меня та же окрошка... на каждый Remoting вызов с возвратом максимум 100 байт тратится от 50 до 100 милисекунд... добавил в один из Remoting объектов
... << RSDN@Home 1.1 alpha 1 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[3]: Сериализация в .NET. Выпрямляем своими руками
Здравствуйте, AndrewG, Вы писали:
AG>Разнес сериализацию/десереализацию на сервер и клиент. AG>Получил увеличенное время десереализации по сравнению с тестовой программой.
AG>На моих данных в тестовой программе было ~ 2.8 сек, на клиенте получил ~ 4.5
Дык а процессоры то какие на машинах?
AG>С чем это может быть связано?
Нужно сравнить с общем временем передачи по сети. Возможно что-то работало в бэкграунде.
Тут вообще есть смысл сравнить общую скорость передачи данных разными форматерами по сети. Потому, как кроме скорости сериализации будет еще фактор вреемени передачи данных. И он может оказаться куда более весомым.
... << RSDN@Home 1.1 beta 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. Выпрямляем своими руками
Всем привет...
Ребята, нашел эту статью...
Хотелось бы попробовать самому...
Не поделитесь инфой, где можно взять библиотеки архивации (ZLIB и SharpZipLib)...
Может кто-то поделиться...
По ссылке в статье я их не нашел.
Если у кого сохранились, скиньте на мыло alex2808@mail.ru
Или ссылку, где их можно прокачать.
Зеранее благодарен.
Всех благ
Re[3]: Сериализация в .NET. Выпрямляем своими руками
А надо ли гонять по сетке датасет или дататаблу именно в виде хмля?
Это чтобы все могли на данные глядеть чтоли? А оно надо?
Имхо куда сподручнее в виде закомпрессованного (плюс опционально зашифрованного) массива байт гонять — и батлнек ширше и враги ничего не поймуть.
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. Выпрямляем своими руками
Здравствуйте, Юнусов Булат, Вы писали:
ЮБ>Здравствуйте, alex2808, Вы писали:
A>>А что это за тип данных Sior.Data.DataSetMessages, которые возвращают методы...
ЮБ>Это не из класса, это пример как достать типизованный датасет их компрессованного массива байт.
Sior.Data.DataSetMessages: я понял, что это отдельный класс, наверное обертка для DataSet с функционалом. Где можно увидить его реализацию, это твой класс или из какого-то пакета?
Всех благ
Re[7]: Сериализация в .NET. Выпрямляем своими руками
Здравствуйте, alex2808, Вы писали:
A>Sior.Data.DataSetMessages: я понял, что это отдельный класс, наверное обертка для DataSet с функционалом. Где можно увидить его реализацию, это твой класс или из какого-то пакета?
Сатый обыкновенный типизованый датасет
Re[2]: Сериализация в .NET. Выпрямляем своими руками
Здравствуйте, Юнусов Булат, Вы писали:
ЮБ>Здравствуйте, Владислав Чистяков, Вы писали:
ЮБ>А надо ли гонять по сетке датасет или дататаблу именно в виде хмля? ЮБ>Это чтобы все могли на данные глядеть чтоли? А оно надо?
Лучше всего гонять именно в таком виде. Сериализация должна знать лишь о типе, но никак не о алгоритмах модификации. Если нужно шифрование или сжатие, то нужно брать подходящее соединение.
Re[3]: Сериализация в .NET. Выпрямляем своими руками
Здравствуйте, Mika Soukhov, Вы писали:
ЮБ>>А надо ли гонять по сетке датасет или дататаблу именно в виде хмля?
MS>Лучше всего гонять именно в таком виде. Сериализация должна знать лишь о типе, но никак не о алгоритмах модификации. Если нужно шифрование или сжатие, то нужно брать подходящее соединение.
Чем лучше ? "Чем грузины"?
Re[3]: Сериализация в .NET. Выпрямляем своими руками
Здравствуйте, Mika Soukhov, Вы писали:
ЮБ>>А надо ли гонять по сетке датасет или дататаблу именно в виде хмля? ЮБ>>Это чтобы все могли на данные глядеть чтоли? А оно надо?
MS>Лучше всего гонять именно в таком виде.
Почему? Голословно.
MS>Сериализация должна знать лишь о типе, но никак не о алгоритмах модификации.
Как будто в моем коде серилизация что то знает. Знаю я, и этого достаточно.
MS>Если нужно шифрование или сжатие, то нужно брать подходящее соединение.
Вариантов куча, выбирай что хошь.