![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Кто может посоветовать быстрый и эффективный способ сериализации объектов в строку и обратно. Объект - достаточно общей структуры, вложенные объекты, перекрестные ссылки... Вот разве что элементов-функций пока не предполагается...
Интересует и не кроссброузерные реализации, для FireFox'а. Пока остановился на нарытом в Интернетах php-serialize-unserialize для JavaScript. Хотя на сложноповязанных объектах его не тестировал, но на первый взгляд - то, что надо... Есть ли что-нибудь попроще-побыстрее? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| IDVsbruck |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 778 Регистрация: 12.11.2006 Репутация: 8 Всего: 22 |
По-моему, удобнее чем JSON ничего нет ...
Использовать рекурсивный способ обхода объекта, записывание в строку и отправка. Само собой, о типах приведения должны знать обе стороны. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
IDVsbruck, Тут немного другая проблема. Предполагается сохранение-восстановление большого объема данных на JavaScript без предачи ее на сервер. Я полагал, что есть какая-то хитрая фенечка от FireFox, такой-же хитрости как и xpath...
А в принципе, json, конечно, получше PHP-сериалайза, хотя бы по тому, что делать придется только одну операцию, а строка преобразуется уже обычным eval'ом... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
json пока не подошел :-(
Нужно уметь сохранять циклические ссылки
Нужно сохранить объект a, так, чтобы при десериализации его возник новый (или старый, если есть ;-) ) объект b и восстановились все ссылки. В Json такое пока не очень вписывается... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| IDVsbruck |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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}]}. Несколько универсальных функций сделают всю работу ... думаю, ничего сложного не будет с поиском объектов, назначением идентефикаторов, установкой дополнительных свойств в зависимых объектах. |
|||
|
||||
| youri |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 17.4.2004 Репутация: 2 Всего: 16 |
а для чего это нужно?
и как насчет связывания объектов через id? |
|||
|
||||
| ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Есть дополнение для FireFox'а - GreaseMonkey. Оно позволяет "подключить" к любой из заданного диапазона страниц дополнительный JavaScript файл. У этого скрипта, в отличии от обычных скриптов странички, появляется возможность сохранять свои переменные в отдельной, зависимой только от этого скрипта области памяти. Выглядит это как "куки", которые не передаются на сервер и доступны только этому скрипту. При работе скрипта, в случае перезагрузки страницы нужно сохранить-восстановить текущее состояние. Вот для этого и нужна процедура де/сериализации объектов. Про область применения такого дополнения - смотрите в Гугле. В основном - мелкая автоматизация, украшательство... Что такое "привязывание по ID" в таком контексте, осталось мне непонятным Пока разродился такой идеей. Вот такой объект
будет преобразован вот в такую строку
где _REF - функция, которая в случае, если есть второй параметр - сохраняет ссылку по индексу из первого параметра и ее выдает, если второго параметра нету - просто выдает ссылку на сохраненный объект. Примерный алгоритм - первый проход: -- пробегаем рекурсивно в глубину объекта и каждому элементу "подвешиваем" дополнительное свойство __saved=true -- если нам оказывается нужно сериализовать объект с уже установленым в true таким свойством - уcтанавливаем это свойство в инкрементируемый счетчик. - второй проход нужен только если обнаружены циклические ссылки. Результат первого прохода отбрасывается -- опять двигаемся вглубь объекта. -- если нам оказывается нужно сериализовать объект с уже установленым в число таким свойством и счетчик больше 0 - возвращаем _REF( счетчик, изображение объекта), счетчик делаем отрицательным. -- если нам оказывается нужно сериализовать объект с уже установленым в число таким свойством и счетчик меньше 0 - возвращаем _REF( счетчик) -третий проход - углубляемся в объект и выкидываем все свойства __saved. Алгорим немного идиотичен, во всяком случае записаный на JavaScript он мне не понравился, попробую пооптимизировать... Это сообщение отредактировал(а) ksnk - 27.7.2009, 01:03 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||
|
|||||
| IDVsbruck |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 778 Регистрация: 12.11.2006 Репутация: 8 Всего: 22 |
youri спросил то, о чем я выше написал ... ссылки указывают не на объекты на их идентефикаторы (посмотри пример).
|
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
IDVsbruck, Ну, если так посмотреть, то 1 из выражения _REF(1) в моих измышлениях, тот самый идентификатор и есть...
В принципе, обычная сериализация в С++ делается в чем-то похожим способом... задача обрастает новыми подробностями. Есть комплект объектов, которые создаются при старте скрипта, их сохранять ни в коем случае не надо + есть комплект объектов, которые хранятся в сериализованных строках. Из первого множества ссылок во второе нет, а из второго есть куда угодно... В принципе, можно перечислить и "поименовать" все объекты из первого множества и после этого сохранять и восстанавливать второе, идентификаторы уже будут известны, проблема лишь в том. что от версии к версии количество "стационарных" объектов может меняться... Очень не хочется, однако придется, сохранять элементы - функции. Сохранять исходный код функции несложно, тем более, что FireFox дает его "посмотреть" скрипту, однако совершенно некошерно. В случае изменения исходного кода элемента будет большой геморой выловить и расстреляять кусочки от прошлой версии... Придется, видимо, набор функций-элементов фиксировать и хранить теми-же идентификаторами. Хотя, возможно удастся элементы функции вообще не использовать... Еще желательно восстанавливать не все объекты, хранящиеся в хранилище, а только нужные. При этом возникает задача подгрузить недостающие "объекты-строки", если на их элементы есть есть ссылки... Получается сумбурно, да еще и задача все время обрастает деталями... А возможно, я ее непреднамеренно усложняю Если будет время, порешаю, чего-нибудь попишу и выложу сюда код... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| youri |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 17.4.2004 Репутация: 2 Всего: 16 |
||||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
пока идет проектирование. Один из ключевых моментов - сохранение данных между релодами страницы. Какие данные будут сохраняться, как они буду выглядеть пока не очень понятно ;-) -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 12 Всего: 34 |
Посмотри на проект php.js, вроде они решили данную задачу.
|
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Itsys, Они там с большой колокольни плюют на рекурсивные ссылки. Мне так нельзя
я имел ввиду именно это решение, (ну или его предшественника судя по комментариям в коде)... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
![]()
|
| Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |