Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Способ сериализации объектов нужен. 
:(
    Опции темы
ksnk
Дата 25.7.2009, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Кто может посоветовать быстрый и эффективный способ сериализации объектов в строку и обратно. Объект - достаточно общей структуры, вложенные объекты, перекрестные ссылки... Вот разве что элементов-функций пока не предполагается...

Интересует и не кроссброузерные реализации, для FireFox'а.

Пока остановился на нарытом в Интернетах php-serialize-unserialize для JavaScript. Хотя  на сложноповязанных объектах его не тестировал, но на первый взгляд - то, что надо... 
Есть ли что-нибудь попроще-побыстрее?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
IDVsbruck
Дата 25.7.2009, 13:13 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



По-моему, удобнее чем JSON ничего нет ...
Использовать рекурсивный способ обхода объекта, записывание в строку и отправка. Само собой, о типах приведения должны знать обе стороны.
PM MAIL   Вверх
ksnk
Дата 25.7.2009, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



IDVsbruck, Тут немного другая проблема. Предполагается сохранение-восстановление большого объема данных на JavaScript без предачи ее на сервер. Я полагал, что есть какая-то хитрая фенечка от FireFox, такой-же хитрости как и xpath...

А в принципе, json, конечно, получше PHP-сериалайза, хотя бы по тому, что делать придется только одну операцию, а строка преобразуется уже обычным eval'ом...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ksnk
Дата 25.7.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



json пока не подошел :-(
Нужно уметь сохранять циклические ссылки
Код

var a={x:1,y:2}, b={prev:a, x:1,y:2}; 
      a.follow=b; 
      a.next=a;

Нужно сохранить объект a, так, чтобы при десериализации его возник новый (или старый, если есть ;-) ) объект b и восстановились все ссылки.

В Json такое пока не очень вписывается...




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
IDVsbruck
Дата 26.7.2009, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не скажи ... 
Во-первых, можно назначать свойства не буквально, а через свою функцию, то это как раз создаст некий свой сериалайзер.
Во-вторых можно использовать идентефикаторы, которые, кстати, можно назначать через глобальную для объекта переменную.
Таким образом, объект уже будет выглядеть не как obj = {var1:val1, var2:{a:{x:1,y:2}, b:{prev:a, x:1,y:2}}}, а типа такого: obj = {var1:val1, var2:[{id:0,x:1,y:2}, {id:1,prev:0, x:1,y:2}]}. Несколько универсальных функций сделают всю работу ... думаю, ничего сложного не будет с поиском объектов, назначением идентефикаторов, установкой дополнительных свойств в зависимых объектах.
PM MAIL   Вверх
youri
Дата 26.7.2009, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а для чего это нужно?
и как насчет связывания объектов через id?
PM   Вверх
ksnk
Дата 27.7.2009, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Цитата(youri @  26.7.2009,  22:39 Найти цитируемый пост)
а для чего это нужно?

Есть дополнение для FireFox'а - GreaseMonkey. Оно позволяет "подключить" к любой из заданного диапазона страниц дополнительный JavaScript файл. У этого скрипта, в отличии от обычных скриптов странички, появляется возможность сохранять свои переменные в отдельной, зависимой только от этого скрипта области памяти. Выглядит это как "куки", которые не передаются на сервер и доступны только этому скрипту. При работе скрипта, в случае перезагрузки страницы нужно сохранить-восстановить текущее состояние. Вот для этого и нужна процедура де/сериализации объектов.

Про область применения такого дополнения - смотрите в Гугле. В основном - мелкая автоматизация, украшательство... 

Что такое "привязывание по ID" в таком контексте, осталось мне непонятным smile

Пока разродился такой идеей. Вот такой объект 
Код

var a={hello:'world'}, b={hello:'world'}; 
      a.xx=b; 
      a.next=a;

 будет преобразован вот в такую строку
Код

_REF(1,{hello:'world',xx:{hello:'world'},next:_REF(1)})

где _REF - функция, которая в случае, если есть второй параметр - сохраняет ссылку по индексу из первого параметра и ее выдает, если второго параметра нету - просто выдает ссылку на сохраненный объект.

Примерный алгоритм
- первый проход:
-- пробегаем рекурсивно в глубину объекта и каждому элементу "подвешиваем" дополнительное свойство __saved=true
-- если нам оказывается нужно сериализовать объект с уже установленым в true таким свойством - уcтанавливаем это свойство в инкрементируемый счетчик.

- второй проход нужен только если обнаружены циклические ссылки. Результат первого прохода отбрасывается 
-- опять двигаемся вглубь объекта.
-- если нам оказывается нужно сериализовать объект с уже установленым в число таким свойством и счетчик больше 0 - возвращаем _REF( счетчик, изображение объекта), счетчик делаем отрицательным.
-- если нам оказывается нужно сериализовать объект с уже установленым в число таким свойством и счетчик меньше 0 - возвращаем _REF( счетчик)

-третий проход - углубляемся в объект и выкидываем все свойства __saved.

Алгорим немного идиотичен, во всяком случае записаный на JavaScript он мне не понравился, попробую пооптимизировать... 


Это сообщение отредактировал(а) ksnk - 27.7.2009, 01:03


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
IDVsbruck
Дата 27.7.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



youri спросил то, о чем я выше написал ... ссылки указывают не на объекты на их идентефикаторы (посмотри пример).
PM MAIL   Вверх
ksnk
Дата 27.7.2009, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



IDVsbruck, Ну, если так посмотреть, то 1 из выражения _REF(1) в моих измышлениях, тот самый идентификатор и есть... smile Тогда получается, что понял...
В принципе, обычная сериализация в С++ делается в чем-то похожим способом...

задача обрастает новыми подробностями.

Есть комплект объектов, которые создаются при старте скрипта, их сохранять ни в коем случае не надо + есть комплект объектов, которые хранятся в сериализованных строках. Из первого множества ссылок во второе нет, а из второго есть куда угодно... В принципе, можно перечислить и "поименовать" все объекты из первого множества и после этого сохранять и восстанавливать второе, идентификаторы уже будут известны, проблема лишь в том. что от версии к версии количество "стационарных" объектов может меняться... 

Очень не хочется, однако придется, сохранять элементы - функции. Сохранять исходный код функции несложно, тем более, что FireFox дает его "посмотреть" скрипту, однако совершенно некошерно. В случае изменения исходного кода элемента будет большой геморой выловить и расстреляять кусочки от прошлой версии...  Придется, видимо, набор функций-элементов фиксировать и хранить теми-же идентификаторами. Хотя, возможно удастся элементы функции вообще не использовать...

Еще желательно восстанавливать не все объекты, хранящиеся в хранилище, а только нужные. При этом возникает задача подгрузить недостающие "объекты-строки", если на их элементы есть есть ссылки...

Получается сумбурно, да еще и задача все время обрастает деталями... А возможно, я ее непреднамеренно усложняю  smile 

Если будет время, порешаю, чего-нибудь попишу и выложу сюда код...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
youri
Дата 27.7.2009, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ksnk @  27.7.2009,  14:21 Найти цитируемый пост)
Получается сумбурно, да еще и задача все время обрастает деталями... А возможно, я ее непреднамеренно усложняю   

вот поэтому я считаю, что нужно описывать задачу с самого верхнего уровня, а не только тот уровень, на котором возникли проблемы ;)
PM   Вверх
ksnk
Дата 27.7.2009, 18:49 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Цитата(youri @  27.7.2009,  18:36 Найти цитируемый пост)
 описывать задачу с самого верхнего уровня

пока идет проектирование. Один из ключевых моментов - сохранение данных между релодами страницы. Какие данные будут сохраняться, как они буду выглядеть пока не очень понятно ;-)


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Itsys
Дата 27.7.2009, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

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



Посмотри на проект php.js, вроде они решили данную задачу.
PM MAIL WWW Skype   Вверх
ksnk
Дата 27.7.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Itsys, Они там с большой колокольни плюют на рекурсивные ссылки. Мне так нельзя smile К тому-же когда я говорил про 
Цитата(ksnk @  25.7.2009,  12:49 Найти цитируемый пост)
 php-serialize-unserialize для JavaScript
 я имел ввиду именно это решение, (ну или его предшественника судя по комментариям в коде)...



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




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


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

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