![]() |
сериализация - десериализация
я очень давно уже об этом думаю, но не собирался до конца с этим разобраться, так как мне до сего момента это было не нужно. Теперь мне это нужно, так как в гугле я нашёл только готовые библиотеки и описание всех прелестей и удобства. Но мне так не нужно, хочу сам разобраться и сделать. Но в голове нет не одной зацепки и точки упора для старта. Подскажите принцип, нужные классы и если кто то знает хорошо исполненные уже готовые классы, дайте ссылку, чтобы хоть понять что там происходит.
|
|
Перешел по приведенной ссылке - страница заблокирована из за вредоносного содержимого.
|
1. Можно и не искать ничего - есть Amf, вшитый во flashplayer и представленный либами для других платформ (правда некоторые безалаберно сделаны и требуют исправления багов перед использованием)
2. Коли интересны имеено бинарные форматы, читайте спецификации Amf(версия 3) или Protobuf. Amf характерен загонами с укладкой небольших чисел в небольшое количество байт, а так же использованием ссылок на одинаковый текст, может сохранять объекты с переплетёнными/циклическими ссылками друг на друга. Но при сильном желании разобраться можно, ничего сверхъестественного там нет. Типизированные данные туда укладываются как динамические с указанием алиаса типа(указывается вручную перед сериализацией и дессериализацией) и просто при распаковке создается не динамический объект, а объект нужного типа. Protobuf характерен тем, что к нему в комплект обычно идёт генератор классов на нужном языке, но сам не использовал, ничего не знаю про этот формат. Принцип? - Берешь, придумываешь формат, и используешь методы ByteArray (вшитый в flashplayer) для записи/чтения чисел/строк, кстати, там есть вшитый метод для записи объектов сразу в amf-формате. |
Цитата:
Сериализация Т.е. сериализация это просто процесс по переводу данных программы в некий "транспортный" либо формат "хранения данных". И всё. Десериализация это собственно наоборот, взяли некое нечто и распаковали его в структуру для удобства использования. Паковать можно во что угодно. Бинарные форматы вон выше ссылки кинули. Распаковывать - в зависимости от задачи. И я догадываюсь откуда взялась тема. Но там имелось в виду что хмл - это не более чем формат сериализации данных. И использовать его в чистом виде в проекте зачастую глупо, и зачастую удобнее его десериализовать во что-то более адекватное. |
Использовал Protobuf для клиент-серверного приложения, очень компактный формат, очень легко разобраться и начать использовать. "С наскока" объекты там не сериализуются - каждый раз надо собирать по свойствам и полям.
Если нужно передавать данные по сети - Protobuf подходит как нельзя лучше. |
Цитата:
я не когда ещё не сталкивался с этим, но понял, что это будет полезно разобрать. Вот и сижу, учу. Добавлено через 30 секунд Babylon Спасибо! Полезная ссылка. Добавлено через 3 часа 24 минуты В готовых библиотеках, есть метод, который описывает классы в xml и наоборот. Как это делают? Мне известно только о describeType который в выводит данные о названии класса и имеющихся доступных свойствах и их типах. Может есть ещё какие то классы и методы которые делают тоже самое, но при этом лучше и удобнее? |
Цитата:
всё гораздо проще. Вот то что ты делал в первом своем посте - как раз и есть десериализация. Ты получаешь хмл, а потом каким-то образом из этой хмл заполняешь данные в свои игровые объекты. |
Цитата:
Цитата:
После того как я увидел готовые библиотеки - то первое что я подумал, нужно это повторить самому. Там есть метод, который при загрузке xml самостоятельно заполняет класс данными. Или берёт класс и создаёт xml. Это очень удобно! Создал класс считал с него и у тебя уже есть готовый внешний файл который можно менять, и затем им заполнять этот чистый класс модели. Тут конечно ещё можно вообще как я понял отказаться от xml, но пока не уверен и пока остановлюсь на создании xml из класса и наоборот. Потому что мне кажется это вообще не заменимым и это нужно самому уметь. Был бы очень рад за словестное подробное изложение этого процесса. Добавлено через 13 минут Мне самое главное понять какие существуют методы для чтения классов. я знаю только describeType, который возвращает xml. Там очень много лишнего, но распарсить мне особо трудно не будет. Добавлено через 16 минут И ещё у этого метода минус ( хотя возможно это наоборот плюс ) он не видит значений. |
Ты вот остановись и подумай.
хмл тебе зачем? |
Dukobpa3 последовал Вашему совету и половина вопросов отпала, но появилось ровно столько же. я решил подумать, что я хочу. Получилось, что мне нужно
1) Хранить данные на сервере. 2) Мне нужно заполнить данными значения свойств классы для которых эти данные предназначались. Казалось бы не так много я и хочу, но эти два пункта как фраза - купить фрукты, без уточнения какие. Чтобы обьяснить ещё более честнее - я не знаю. У меня в голове вообще тупик, который пока я не преодолею не сдвинусь дальше. Расскажите мне что нибудь) Добавлено через 24 минуты я сейчас ещё раз перечитал всё по ссылке которую привел в пример Babylon, но там говорится о готовом решении, да и то с указанием строгой типизации и ещё чего то. я нашел тоже готовое, но там даже не чего указывать не надо и как то все тоже самое делается. Вопрос не в велосипеде, а в усвоении процесса. Если не учить самому, а только пользоваться готовом, то для меня это выглядит, как кадры и компоненты. Добавлено через 2 минуты я мало понимаю, но мне без разницы формат хранения. Пусть хоть какой будет. я не понимаю, как потом этот формат присвоить в качестве значения классу для которого он предназначен. |
Вот ты не ставь самоцелью классы и данные.
Это всего-лишь инструменты. Ты сначала подумай что ты хочешь в итге получить, а уже потом выбирай инструменты. Всегда исходи из цели. Если в твоем случае цель - научиться - то все-равно придумай себе какой-то реальный проект, хоть мелкий, реальную задачу. И уже ее решай. А там уже станет понятно что лучше хмл, или жсон или вообще без базы данных обойтись. |
Пока у меня вот какие рассуждения - про xml я не первый раз слышу не лестные отзывы и понимаю почему, слишком он тяжелый. Если делать выбор сейчас, то предпочтения будут перевешивать в сторону json, потому что я много слышал про него и уже сейчас знаю, что использование.. точнее сказать - учиться на нём сейчас, значит использовать актуальную технологию. Про сам json знаю очень мало, но понимаю что его полезно использовать. И тогда я чтобы не упускать момент спрошу - какая самая быстрая библиотека для работы с ним?
И ещё не понятно про Protobuf. Он аналог xml? Можно его использовать так же как и json? Быстрее он? |
Сериализация не существует сама по себе как самоценность. Применение той или иной сериализации обусловлено характером решаемой задачи, применяемыми транспортными протоколами и применяемыми механизмами хранения данных.
Я бы не стал забывать и о накладных расходах на сериализацию и (соответственно, десериализацию). Например, хранить в обычной бд вроде MySQL в сериализованном виде сущности, которые считываются из бд редко - это очень удобно. Но вот, например, хранить в ней в сериализованном виде профиль пользователя - это весьма спорное решение. Когда тебе надо изменить значение баланса в ингейме, а для этого нужно считать весь профиль, десериализовать, изменить баланс, сериализовать обратно и записать профиль целиком - тут и ежу понятно, что изменение одного поля int с балансом намного быстрее. С транспортом тоже не все так очевидно. Мне кажется, для многих задач такой сериализации, как json - за глаза и за уши. Что касается сравнения xml и json по компактности, то разница по объему "сильно преувеличена" (см. пример ниже), но читаемость у json-а практически нулевая, если только не приводить его к читабельному виду специально, а у xml - более-менее. Кроме того, для флеша - xml нативный, что тоже немаловажно. Код:
// xml |
mikhailk, а как же примеры побольше? Например
Код:
<car>У нас в универе преподаватели помню тоже очень скептически относились к этому формату, сколько ни обсуждали с ними различия/плюсы/минусы, всех таки заставляли использовать XML, не шли ни на какие уступки :) ) Akopalipsis, Protobuf тоже в голове держите, это наиболее компактный из всех (из трех - XML, JSON, Protobuf) способов (отлично для передачи критичных ко времени данных) и его, в отличие от XML и JSON нельзя сходу прочитать и понять что там и как. При этом сам формат передаваемого сообщения (поля и их возможные значения) задаются целиком на этапе проектирования |
Цитата:
Цитата:
Добавлено через 48 минут Может кто нибудь подкинуть правильное направление в вопросе - как наполнить модель данными? Потому что для меня только один путь известен - строку, распарсить regexp на ключ-значение, набить ими массив и потом ключи подставлять как свойство класса class['key'] = val; Но мне кажется это не правильное направление. Или я ошибаюсь? Добавлено через 46 минут Что бы не сидеть и не смотреть в экран, решил сделать парсер класса, что бы не писать руками все свойства и методы. Использую для этого describeType() так как лучше не чего не знаю. Информацию этот метод хорошую предоставляет, но нет значений, а вместо этого есть не понятная мне строчка Код AS3:
Код AS3:
|
Цитата:
Грамотно составить хмл - это тоже определенный навык. Половину описания жсона который вы привели - можно сделать атрибутами, тогда разницы практически не будет. Добавлено через 1 минуту Код:
<car Код:
//XMLЦитата:
|
Для того у нас и есть JSON и XML чтобы строку не парсить на ключ/значение :)
На самом простом примере MySQL, PHP и Flash: Mysql: Код:
//Имеем таблицу usersPHP код:
Код AS3:
Все писал прямо тут, поэтому за очипятки и прочие ошибки тапками прошу не кидаться. :) ---- Цитата:
----- Цитата:
|
Цитата:
|
считать закрывающие скобки удобнее чем теги;)
|
Цитата:
|
Цитата:
А парсить руками эти вещи нет никакой необходимости при наличии соответствующих библиотек. Разве что в каких-то крайних случаях. |
Цитата:
|
*facepalm*
XML JSON Есть в стандартных пакетах флеша. Ваш Кеп. |
Вот про встроенные классы я бы хотел уточнить. Отправился я в гугл и сперва наткнулся на более старые темы про json, времён как я понял, когда ещё встроен он не был. И попались мне классы as3corelib, начав искать про которые я наткнулся вот на эту тему
http://www.flasher.ru/forum/blog.php?b=203&page=2 Приведённая автором разница в скорости вообще космическая. Ну а потом я где то прочитал, что вот эти самые старые классы ( as3corelib ) теперь переехали официально и стали JSON. Если я не в чем не ошибся, то хочется узнать - проблемы скорости остались прежними? |
Да, вроде у BloodHound до сих пор самые быстрые (де-)сериализаторы. Разве что JSON теперь во флеше нативный и работает
Цитата:
Просто у кого алгоритмы более шустрые. |
|
Цитата:
|
Цитата:
А вообще, автор по-моему хочет, чтобы ему рассказали об всем многообразии вариантов (не знаю, правда, зачем ему это нужно). Там, если честно, масса всего неожиданного. Я вот сейчас сервер делал, так научился парсить и сериализовать YAML. Тоже ведь кто-то и придумал и формализовал... |
Цитата:
|
"Родной" JSON работает почти в 2 раза быстрее, чем работал у BloodHound.
Вопрос в другом, что до сих пор не у всех стоит 11й плеер. --- // --- Сериализация/десериализация строки Цитата:
Цитата:
|
Говоря про JSON мы забываем что XML исп. в запросах. Причем весьма лаконично. Как с этим у JSON?:)
|
Цитата:
|
e4x видимо)
|
Говоря про XML мы забываем, что API VK и Facebook принимают и отправляют все данные в виде JSON объектов ;D
Да и потом, перед использованием XML файла в коде его придется предварительно распарсить.. |
Цитата:
Речь о доступе к данным? myXml.node.(@param=123) и все такое? Добавлено через 8 минут Цитата:
Нет? |
Апи вк уже не помню, чаще с фб общаюсь, и в ФБ таки жсон везде. Или js Object, который == as3 Object
|
Цитата:
Просто сколько использовал - пользовался возвращаемыми по умолчанию JSON объектами |
Цитата:
|
Цитата:
Если речь о том, чтобы передать и как-то заполнить данными объекты, то разницы принципиальной нет. Если речь о том, чтобы получить и сразу использовать, то XML удобнее. Вот конкретный пример: Код:
<imgLibraries>Код AS3:
Другое дело, когда сервер работает с JSON (например, у меня есть проект на платформе nodejs+mongodb, где вообще работать с чем-то, кроме JSON несколько странно). |
| Часовой пояс GMT +4, время: 03:04. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.