Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> кросплатформенная сериализация объектов, какие есть варианты ? 
:(
    Опции темы
sir_nuf_nuf
Дата 5.11.2008, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Товарищи!

Кто может посоветовать модуль для сериализации объектов ?
Требования:
1) Кросплатформенность
2) Обратная совместимость - что бы при обновлении модуля, мы могли десереализовать объекты, сереализованные старой версией.
3) Малый размер сериализованных объектов..
4) Скорость как-никак.  (XML не предлагать)

Задумка такова: хранить в куках пользователя различные perl - объекты

Сейчас использую Storable.pm но недоволен, т.к. есть проблемы с совместимостью..
обновилась версия модуля на сервере (админы решили "помочь", например) - пользователи со старыми куками идут лесом.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
gcc
Дата 5.11.2008, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



Data::Dumper?
PM WWW ICQ Skype GTalk Jabber   Вверх
IceSunrise
Дата 5.11.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 7.4.2008
Где: Санкт-Петербург

Репутация: 3
Всего: 3



App::Serializer::Storable меня не подводил.
PM MAIL   Вверх
ginnie
Дата 5.11.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



sir_nuf_nuf, сам я модули для сериализации не использовал, поэтому подсказать что-то хорошее не могу. Из Интернет-рекомендаций обратил внимание на JSON::XS.
По поводу Вашей затеи, насколько безопасно для системы хранить объекты на стороне пользователя? Чем такой подход лучше хранения данных на сервере?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
KSURi
Дата 5.11.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Согласен с ginnie, я бы попробовал JSON.

А у вас не было проблем со Storable из-за того, что он сериализует данные в бинарный вид (т.е. имеются непечатные символы)? Это не отражается негативно на куках?


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
sir_nuf_nuf
Дата 5.11.2008, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Цитата(ginnie @  5.11.2008,  16:45 Найти цитируемый пост)
По поводу Вашей затеи, насколько безопасно для системы хранить объекты на стороне пользователя? Чем такой подход лучше хранения данных на сервере? 

Да, достаточно безопасно. Это data-objects, ничего более. 

Чем лучше чем на сервере.. ну на сервере либо неперсистентно (memcached), либо из пушки по воробьям (БД), либо лишние траблы (BerkeleyDB). Cookie - самое - то =)


Цитата(KSURi @  5.11.2008,  17:10 Найти цитируемый пост)
А у вас не было проблем со Storable из-за того, что он сериализует данные в бинарный вид (т.е. имеются непечатные символы)? Это не отражается негативно на куках?

неа.. не было. По видиму модули для работы с куками Apache2::Cookie сами все эскейпят..


JSON::XS... хм.. попробуем =) скоро выложу сравнение производительности.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
ginnie
Дата 5.11.2008, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



sir_nuf_nuf, чем cookie от memcached отличаются (наличие cookie тоже никто не гарантирует)?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
sir_nuf_nuf
Дата 5.11.2008, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Цитата(ginnie @  5.11.2008,  18:15 Найти цитируемый пост)
sir_nuf_nuf, чем cookie от memcached отличаются

куки - на совести клиента. если клиент параноик или девелопер и трет куки через 10 минут - мы бессильны (ну почти)
а вот выпадение из memcached - на нашей совести!

Добавлено через 1 минуту и 38 секунд
Товарищи! я фшоке =)
Код

[root@jade1 ~/tmp]# cat serial.pl
#!/usr/bin/perl
use warnings;
use strict;

use Storable qw(thaw nfreeze);
use JSON::XS;


my $obj = {
    'aid' => 'urn:uuid:146251789-0b0d-4054-9c65-c7152995f84',
    'real_url' => 'http://jdu.ru/for_anor/first=1&sold=GfQQwrbnv.e4ANQ.didlQrDCdW2IjTKe',
    'ecid' => 'urn:d2d6fc4240cd2171:-1e3e015:11d6d01b15e:-79e60001',
    'pid' => 'http://ad.agava.net/registry/project/pp-test.testsbox.ru',
    'groups' => [
            {
                'sex' => undef,
                'age' => undef,
                'gid' => 'urn:cgroup:11'
            },
        ],
    'category' => 'http://ad.agava.net/categorization/dating-mamba'
};

my $ice = "";
my $count = $ARGV[1] || 5000;

if ($ARGV[0] =~ /json/i) {
    while ($count--) {
        $ice = encode_json($obj);
        $obj = decode_json($ice);
    }
}elsif ($ARGV[0] =~ /storable/i){
    while ($count--) {
        $ice = nfreeze($obj);
        $obj = thaw($ice);
    }
}


Код

[root@jade1 ~/tmp]# time ./serial.pl  json 100000

real    0m1.437s
user    0m1.426s
sys     0m0.007s
[root@jade1 ~/tmp]# time ./serial.pl storable 100000

real    0m7.576s
user    0m7.555s
sys     0m0.000s


JSON::XS - в разы (5!) быстрее!


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
gcc
Дата 25.2.2010, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



я еще нашел вариант серилизировать так

Код

mysql> select * from sessions;
+--------------------------------------------------+------------------------------------------------+
| id |
| session_data
| expires |
+--------------------------------------------------+-------------------------------------------------+-
| session:ef8fd20dfd27e463d70633793f282b657541176c | BQcDAAAABAoHZGVmYXVsdAAAAAxfX3VzZXJfcmVhbG0KATEAAAAGX191c2VyCgoxMjMzMzM4NjIx
AAAACV9fY3JlYXRlZAoKMTIzMzMzODYyMgAAAAlfX3VwZGF0ZWQ=
| 1233345726 | 


Код

echo 'BQcDAAAABAoHZGVmYXVsdAAAAAxfX3VzZXJfcmVhbG0KATEAAAAGX191c2VyCgoxMjQxNTA3MDAxAAAACV9fY3JlYXRlZAoKMTI0MTUwNzAwMgAAAAlfX3VwZGF0ZWQ=' | base64 -d |xxd
0000000: 0507 0300 0000 040a 0764 6566 6175 6c74  .........default
0000010: 0000 000c 5f5f 7573 6572 5f72 6561 6c6d  ....__user_realm
0000020: 0a01 3100 0000 065f 5f75 7365 720a 0a31  ..1....__user..1
0000030: 3234 3135 3037 3030 3100 0000 095f 5f63  241507001....__c
0000040: 7265 6174 6564 0a0a 3132 3431 3530 3730  reated..12415070
0000050: 3032 0000 0009 5f5f 7570 6461 7465 64    02....__updated


Код


 use MIME::Base64;
 use Storable qw/nfreeze thaw/;
 my $decoded = thaw(decode_base64($loop_data->{session_data}));
use Data::Dumper;
  print Dumper($decoded);

хэш

$VAR1 = {
          '__user_realm' => 'default',
          '__created' => '1233338621',
          '__user' => '1',
          '__updated' => '1233338622'
        };



например, есть таблица в которой много столбиков и запрос идет сразу с 4-7 таблиц через LEFT JOIN и INNER JOIN, и на этой странице еще 3-5 запросов с разных таблиц и счетчики SUM и count()


это ресурсоемко для MySQL чтобы вытащить с разных таблиц + условия довольно не простые  и еще столбцов довольно много...

а для perl ресурсоемко формировать (инициализировать) хэши и массивы все время новые...



вот можно создать таблицу cache01 еще одну :

id  | time_cache_expires |  cache_data

time_cache_expires - время когда активынй хэш  
cache_data - в идеальном представлении серилизированный хэш (и/или хэщ-хэшей, массив-хэшей и т.д)

'SELECT cache_data from cache01 where id = ? AND time_cache_expires < '.time ;
такой запрос будет минималистический для MySQL...)?

или не изобретать велосипед, а лучше в строну memcache? 


вот тут вот есть еще какое-то кэширование http://search.cpan.org/~timb/DBI-1.609/DBI.pm#prepare_cached
с Tie::Cache::LRU:











Это сообщение отредактировал(а) gcc - 25.2.2010, 18:57
PM WWW ICQ Skype GTalk Jabber   Вверх
DurRandir
Дата 26.2.2010, 06:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



JSON::XS всем хорош, кроме следующего:

1. Он сериализует хеши/массива, но не объекты. Если надо восстанавливать информацию о том, что это был blessed hash - придётся дописывать обёртку. 
2. Он не умеет работать с рекурсивными объектами. Именно за счёт этого достигается наибольший % прироста скорости по сравнению сo Storable.
3. Если кодируете utf8 строки, возможно, придётся разбираться в том, в каком виде они вернутся/хранятся (с/без флага, байтами/символами).

А так я перешёл на него сo Storable для своего внутреннего обмена - никаких нареканий.

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0974 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.