Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   сериализация - десериализация (http://www.flasher.ru/forum/showthread.php?t=202772)

Akopalipsis 09.08.2013 02:27

сериализация - десериализация
 
я очень давно уже об этом думаю, но не собирался до конца с этим разобраться, так как мне до сего момента это было не нужно. Теперь мне это нужно, так как в гугле я нашёл только готовые библиотеки и описание всех прелестей и удобства. Но мне так не нужно, хочу сам разобраться и сделать. Но в голове нет не одной зацепки и точки упора для старта. Подскажите принцип, нужные классы и если кто то знает хорошо исполненные уже готовые классы, дайте ссылку, чтобы хоть понять что там происходит.

Babylon 09.08.2013 03:34

http://actualwave.com/blog/?p=608#n/...TN5tMogOhlPB0A

PainKiller 09.08.2013 10:44

Перешел по приведенной ссылке - страница заблокирована из за вредоносного содержимого.

expl 09.08.2013 11:51

1. Можно и не искать ничего - есть Amf, вшитый во flashplayer и представленный либами для других платформ (правда некоторые безалаберно сделаны и требуют исправления багов перед использованием)
2. Коли интересны имеено бинарные форматы, читайте спецификации Amf(версия 3) или Protobuf.

Amf характерен загонами с укладкой небольших чисел в небольшое количество байт, а так же использованием ссылок на одинаковый текст, может сохранять объекты с переплетёнными/циклическими ссылками друг на друга. Но при сильном желании разобраться можно, ничего сверхъестественного там нет.
Типизированные данные туда укладываются как динамические с указанием алиаса типа(указывается вручную перед сериализацией и дессериализацией) и просто при распаковке создается не динамический объект, а объект нужного типа.

Protobuf характерен тем, что к нему в комплект обычно идёт генератор классов на нужном языке, но сам не использовал, ничего не знаю про этот формат.

Принцип? - Берешь, придумываешь формат, и используешь методы ByteArray (вшитый в flashplayer) для записи/чтения чисел/строк, кстати, там есть вшитый метод для записи объектов сразу в amf-формате.

Dukobpa3 09.08.2013 11:57

Цитата:

хочу сам разобраться и сделать.
А что сделать то?
Сериализация
Т.е. сериализация это просто процесс по переводу данных программы в некий "транспортный" либо формат "хранения данных". И всё.
Десериализация это собственно наоборот, взяли некое нечто и распаковали его в структуру для удобства использования.

Паковать можно во что угодно. Бинарные форматы вон выше ссылки кинули.
Распаковывать - в зависимости от задачи.

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

KumoKairo 09.08.2013 11:58

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

Akopalipsis 09.08.2013 18:07

Цитата:

И я догадываюсь откуда взялась тема.
Да, я после Ваших слов отправился в поиск и первое, что он выдал, статья о готовых библиотеках сериализации - десериализации. я естественно скачал и мне понравилось, что по мимо сжатия и конвертации, там есть много других полезных инструментов, таких как наполнение значениями обьекты.
я не когда ещё не сталкивался с этим, но понял, что это будет полезно разобрать. Вот и сижу, учу.

Добавлено через 30 секунд
Babylon Спасибо! Полезная ссылка.

Добавлено через 3 часа 24 минуты
В готовых библиотеках, есть метод, который описывает классы в xml и наоборот. Как это делают? Мне известно только о describeType который в выводит данные о названии класса и имеющихся доступных свойствах и их типах. Может есть ещё какие то классы и методы которые делают тоже самое, но при этом лучше и удобнее?

Dukobpa3 09.08.2013 19:43

Цитата:

describeType
Akopalipsis, не лезь пока туда)) оно не надо)
всё гораздо проще. Вот то что ты делал в первом своем посте - как раз и есть десериализация.

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

Akopalipsis 09.08.2013 22:15

Цитата:

Akopalipsis, не лезь пока туда)) оно не надо)
Возможно!
Цитата:

И использовать его в чистом виде в проекте зачастую глупо, и зачастую удобнее его десериализовать во что-то более адекватное.
Про более адекватное я хотел потом спросить, но раз такое дело, то в какое?
После того как я увидел готовые библиотеки - то первое что я подумал, нужно это повторить самому.
Там есть метод, который при загрузке xml самостоятельно заполняет класс данными. Или берёт класс и создаёт xml. Это очень удобно! Создал класс считал с него и у тебя уже есть готовый внешний файл который можно менять, и затем им заполнять этот чистый класс модели. Тут конечно ещё можно вообще как я понял отказаться от xml, но пока не уверен и пока остановлюсь на создании xml из класса и наоборот. Потому что мне кажется это вообще не заменимым и это нужно самому уметь. Был бы очень рад за словестное подробное изложение этого процесса.

Добавлено через 13 минут
Мне самое главное понять какие существуют методы для чтения классов. я знаю только describeType, который возвращает xml. Там очень много лишнего, но распарсить мне особо трудно не будет.

Добавлено через 16 минут
И ещё у этого метода минус ( хотя возможно это наоборот плюс ) он не видит значений.

Dukobpa3 09.08.2013 22:36

Ты вот остановись и подумай.
хмл тебе зачем?

Akopalipsis 10.08.2013 01:08

Dukobpa3 последовал Вашему совету и половина вопросов отпала, но появилось ровно столько же. я решил подумать, что я хочу. Получилось, что мне нужно
1) Хранить данные на сервере.
2) Мне нужно заполнить данными значения свойств классы для которых эти данные предназначались.
Казалось бы не так много я и хочу, но эти два пункта как фраза - купить фрукты, без уточнения какие.
Чтобы обьяснить ещё более честнее - я не знаю. У меня в голове вообще тупик, который пока я не преодолею не сдвинусь дальше. Расскажите мне что нибудь)

Добавлено через 24 минуты
я сейчас ещё раз перечитал всё по ссылке которую привел в пример Babylon, но там говорится о готовом решении, да и то с указанием строгой типизации и ещё чего то. я нашел тоже готовое, но там даже не чего указывать не надо и как то все тоже самое делается. Вопрос не в велосипеде, а в усвоении процесса. Если не учить самому, а только пользоваться готовом, то для меня это выглядит, как кадры и компоненты.

Добавлено через 2 минуты
я мало понимаю, но мне без разницы формат хранения. Пусть хоть какой будет. я не понимаю, как потом этот формат присвоить в качестве значения классу для которого он предназначен.

Dukobpa3 10.08.2013 01:40

Вот ты не ставь самоцелью классы и данные.
Это всего-лишь инструменты.
Ты сначала подумай что ты хочешь в итге получить, а уже потом выбирай инструменты.
Всегда исходи из цели. Если в твоем случае цель - научиться - то все-равно придумай себе какой-то реальный проект, хоть мелкий, реальную задачу. И уже ее решай. А там уже станет понятно что лучше хмл, или жсон или вообще без базы данных обойтись.

Akopalipsis 10.08.2013 03:12

Пока у меня вот какие рассуждения - про xml я не первый раз слышу не лестные отзывы и понимаю почему, слишком он тяжелый. Если делать выбор сейчас, то предпочтения будут перевешивать в сторону json, потому что я много слышал про него и уже сейчас знаю, что использование.. точнее сказать - учиться на нём сейчас, значит использовать актуальную технологию. Про сам json знаю очень мало, но понимаю что его полезно использовать. И тогда я чтобы не упускать момент спрошу - какая самая быстрая библиотека для работы с ним?
И ещё не понятно про Protobuf. Он аналог xml? Можно его использовать так же как и json? Быстрее он?

mikhailk 10.08.2013 11:36

Сериализация не существует сама по себе как самоценность. Применение той или иной сериализации обусловлено характером решаемой задачи, применяемыми транспортными протоколами и применяемыми механизмами хранения данных.

Я бы не стал забывать и о накладных расходах на сериализацию и (соответственно, десериализацию). Например, хранить в обычной бд вроде MySQL в сериализованном виде сущности, которые считываются из бд редко - это очень удобно. Но вот, например, хранить в ней в сериализованном виде профиль пользователя - это весьма спорное решение. Когда тебе надо изменить значение баланса в ингейме, а для этого нужно считать весь профиль, десериализовать, изменить баланс, сериализовать обратно и записать профиль целиком - тут и ежу понятно, что изменение одного поля int с балансом намного быстрее.

С транспортом тоже не все так очевидно. Мне кажется, для многих задач такой сериализации, как json - за глаза и за уши.

Что касается сравнения xml и json по компактности, то разница по объему "сильно преувеличена" (см. пример ниже), но читаемость у json-а практически нулевая, если только не приводить его к читабельному виду специально, а у xml - более-менее. Кроме того, для флеша - xml нативный, что тоже немаловажно.


Код:

// xml
<service timePointStart="12456789"  timePointFinish="12459789" cost="2000" />

// json
{"service":{"timePointStart":"12456789","timePointFinish":"12459789","cost":"2000"}}


KumoKairo 10.08.2013 13:14

mikhailk, а как же примеры побольше? Например
Код:

<car>
//XML
  <company>Volkswagen</company>
  <name>Vento</name>
  <price>800000</price>
</car>

//JSON
{
  "company": Volkswagen,
  "name": "Vento",
  "price": 800000
}

//XML
    <employees>
      <employee>
        <name>John Crichton</name>
        <gender>male</gender>
      </employee>
      <employee>
        <name>Aeryn Sun</name>
        <gender>female</gender>
      </employee>
    </employees>

//JSON
    {
      "employees": [
        {
          "name": "John Crichton",
          "gender": "male"
        },
        {
          "name": "Aeryn Sun",
          "gender": "female"
        }
      ]
    }

JSON не зря называют "Обезжиренной" версией XML, да и потом, c недавних пор (с фп 11) JSON тоже является нативным форматом для флеш (до этого времени была отдельная библиотека, если не ошибаюсь).
У нас в универе преподаватели помню тоже очень скептически относились к этому формату, сколько ни обсуждали с ними различия/плюсы/минусы, всех таки заставляли использовать XML, не шли ни на какие уступки :) )

Akopalipsis, Protobuf тоже в голове держите, это наиболее компактный из всех (из трех - XML, JSON, Protobuf) способов (отлично для передачи критичных ко времени данных) и его, в отличие от XML и JSON нельзя сходу прочитать и понять что там и как. При этом сам формат передаваемого сообщения (поля и их возможные значения) задаются целиком на этапе проектирования

Akopalipsis 10.08.2013 15:48

Цитата:

хранить в ней в сериализованном виде профиль пользователя - это весьма спорное решение
mikhailk Спасибо Вам, для меня это очень полезная информация, о которой я обязательно буду помнить.
Цитата:

JSON не зря называют "Обезжиренной" версией XML, да и потом, c недавних пор (с фп 11) JSON тоже является нативным форматом для флеш (до этого времени была отдельная библиотека, если не ошибаюсь).
я пока остановлюсь на нёт, так как все равно рано или поздно пришлось бы его использовать и попрактиковаться сейчас, это даже к лучшему. Но вот я вчера наткнулся на тему на этом форуме, где автор приводил время хода сериализации адобовских классов и его собственных. Разница была умопомрачительная, от 2000 тысяч адоб, 70 его. я не гений и претендовать на него даже в голове нет, а использовать сериализацию хочется уже сейчас. И от сюда вопрос - какая лучшая библиотека для сериализации json? Спасибо.

Добавлено через 48 минут
Может кто нибудь подкинуть правильное направление в вопросе - как наполнить модель данными?
Потому что для меня только один путь известен - строку, распарсить regexp на ключ-значение, набить ими массив и потом ключи подставлять как свойство класса class['key'] = val;
Но мне кажется это не правильное направление. Или я ошибаюсь?

Добавлено через 46 минут
Что бы не сидеть и не смотреть в экран, решил сделать парсер класса, что бы не писать руками все свойства и методы. Использую для этого describeType() так как лучше не чего не знаю. Информацию этот метод хорошую предоставляет, но нет значений, а вместо этого есть не понятная мне строчка
Код AS3:

<arg key="pos" value="58"/>

Код AS3:

<arg key="pos" value="90"/>

Может знает кто нибудь, что это? и если это значения то в каком формате?

Dukobpa3 10.08.2013 15:51

Цитата:

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

Добавлено через 1 минуту
Код:

<car
    company="Volkswagen"
    name="Vento"
    price=800000 />

//JSON
"car":{
  "company": Volkswagen,
  "name": "Vento",
  "price": 800000
}

Добавлено через 4 минуты
Код:

//XML
    <employees>
      <employee
        name="John Crichton"
        gender="male"
      />
      <employee
        name="Aeryn Sun"
        gender="female"
      />
    </employees>

//JSON
    {
      "employees": [
        {
          "name": "John Crichton",
          "gender": "male"
        },
        {
          "name": "Aeryn Sun",
          "gender": "female"
        }
      ]
    }

Добавлено через 5 минут
Цитата:

так как лучше не чего не знаю.
describeType() - описывает структуру, а не данные которые в ней содержатся. Это совсем в другую степь.

Котейка 10.08.2013 16:15

Для того у нас и есть JSON и XML чтобы строку не парсить на ключ/значение :)
На самом простом примере MySQL, PHP и Flash:

Mysql:
Код:

//Имеем таблицу users
user_id, user_name, user_age

PHP:
PHP код:

//Берем данные из базы и отдаем клиенту
if(isset($_POST['uid']))
{
   
$id = (int)$_POST['uid'];
   
$result $db->query("SELECT * FROM users WHERE user_id = " $id);
   
$array $result->fetch();
   echo 
json_encode($array);


AS:
Код AS3:

...
 
var variables:URLVariables = new URLVariables();
variables['uid'] = 1;
 
var request:URLRequest = new URLRequest("http://mysite.ru/index.php");
request.method = URLRequestMethod.POST;
request.data = variables;
 
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onLoad);
loader.load(request)
 
...
 
private function onLoad(e:Event):void
{
        e.currentTarget.removeEventListener(Event.COMPLETE, onLoad);
        var data:Object = JSON.parse(e.currentTarget.data);
        var user:User = new User(data);
}
 
//И класс User
package
{
        public class User
        {
                private var _id:int;
                private var _name:String;
                private var _age:int;
                public function User(data:Object)
                {
                        _id = int(data.user_id);
                        _name = data.user_name;
                        _age = int(data.user_age);
                }
        }
}

В случае с XML все примерно так же.
Все писал прямо тут, поэтому за очипятки и прочие ошибки тапками прошу не кидаться. :)
----
Цитата:

Но вот я вчера наткнулся на тему на этом форуме, где автор приводил время хода сериализации адобовских классов и его собственных. Разница была умопомрачительная, от 2000 тысяч адоб, 70 его. я не гений и претендовать на него даже в голове нет, а использовать сериализацию хочется уже сейчас. И от сюда вопрос - какая лучшая библиотека для сериализации json? Спасибо.
Не забивайте себе этим голову. Вы же не андроинный коллайдер изобретаете. JSON не то место, где надо всерьез думать о производительности в 90% проектов. Лучше сконцентрируйтесь на производительности своего кода и отрисовке графики, именно там куда больше потенциальных тормозов, нежели в производительности адобовских либ. :)
-----
Цитата:

но читаемость у json-а практически нулевая, если только не приводить его к читабельному виду специально, а у xml - более-менее.
Это довольно спорный вопрос. JSON кажется не читабельным для тех кто привык работать с HTML и XML. А для тех кто привык оперировать объектами наоборот. :)

mikhailk 10.08.2013 17:01

Цитата:

да и потом, c недавних пор (с фп 11) JSON тоже является нативным форматом для флеш (до этого времени была отдельная библиотека, если не ошибаюсь).
Дудки. Просто парсер переехал. :)

Babylon 10.08.2013 18:49

считать закрывающие скобки удобнее чем теги;)

Akopalipsis 10.08.2013 18:54

Цитата:

Сообщение от Babylon (Сообщение 1143349)
считать закрывающие скобки удобнее чем теги;)

Это вы к тому, что распарсивать строку легче по скобкам чем по тэгам? Типа, скобка открылась, распарсил, закрылась, значит заканчиваем парсить?

Dukobpa3 10.08.2013 18:56

Цитата:

что распарсивать строку легче по скобкам чем по тэгам?
Это к тому что жсон выгляит точь в точь так же как Object во флеше. И во многих языках привычнее смотреть на скобки. Так как везде они есть.

А парсить руками эти вещи нет никакой необходимости при наличии соответствующих библиотек. Разве что в каких-то крайних случаях.

Akopalipsis 10.08.2013 19:16

Цитата:

соответствующих библиотек.
Поделитесь названиями?)

Dukobpa3 10.08.2013 19:18

*facepalm*
XML
JSON

Есть в стандартных пакетах флеша.
Ваш Кеп.

Akopalipsis 10.08.2013 20:56

Вот про встроенные классы я бы хотел уточнить. Отправился я в гугл и сперва наткнулся на более старые темы про json, времён как я понял, когда ещё встроен он не был. И попались мне классы as3corelib, начав искать про которые я наткнулся вот на эту тему
http://www.flasher.ru/forum/blog.php?b=203&page=2
Приведённая автором разница в скорости вообще космическая. Ну а потом я где то прочитал, что вот эти самые старые классы ( as3corelib ) теперь переехали официально и стали JSON. Если я не в чем не ошибся, то хочется узнать - проблемы скорости остались прежними?

MikroAcse 10.08.2013 21:01

Да, вроде у BloodHound до сих пор самые быстрые (де-)сериализаторы. Разве что JSON теперь во флеше нативный и работает примерно с той же скоростью быстрее, чем у bloodhound в 2 раза.

Цитата:

проблемы скорости остались прежними
Проблемы скорости не у флеша, а у создателей as3corelib, т.е. Adobe.
Просто у кого алгоритмы более шустрые.

Dukobpa3 10.08.2013 21:07

Справочник по ActionScript

Akopalipsis 10.08.2013 21:09

Цитата:

Справочник по ActionScript
Естественно я про него знаю)

mikhailk 10.08.2013 21:15

Цитата:

Это к тому что жсон выгляит точь в точь так же как Object во флеше.
Ну если быть корректным, то тогда уж скорее не JSON, а BSON.

А вообще, автор по-моему хочет, чтобы ему рассказали об всем многообразии вариантов (не знаю, правда, зачем ему это нужно). Там, если честно, масса всего неожиданного. Я вот сейчас сервер делал, так научился парсить и сериализовать YAML. Тоже ведь кто-то и придумал и формализовал...

Akopalipsis 10.08.2013 21:18

Цитата:

А вообще, автор по-моему хочет, чтобы ему рассказали об всем многообразии вариантов (не знаю, правда, зачем ему это нужно).
Не совсем так, я немного подучу, поэксперементирую, а потом либо спрошу уже на примере, либо покажу что я хотел.

Котейка 10.08.2013 21:27

"Родной" JSON работает почти в 2 раза быстрее, чем работал у BloodHound.
Вопрос в другом, что до сих пор не у всех стоит 11й плеер.
--- // ---
Сериализация/десериализация строки
Цитата:

"{\"param\":1,\"param2\":\"hello\",\"param3\":[1,2,3], \"param4\":{\"subparam\":1,\"subparam2\":\"xxx\"}}"
10000 итераций.
Цитата:

as3corelib ~1200
blooddy_crypto ~580
Нативный: ~280

Babylon 10.08.2013 22:26

Говоря про JSON мы забываем что XML исп. в запросах. Причем весьма лаконично. Как с этим у JSON?:)

mikhailk 10.08.2013 22:39

Цитата:

Говоря про JSON мы забываем что XML исп. в запросах. Причем весьма лаконично. Как с этим у JSON?
Запросах чего к чему?

Dukobpa3 10.08.2013 22:40

e4x видимо)

KumoKairo 10.08.2013 23:10

Говоря про XML мы забываем, что API VK и Facebook принимают и отправляют все данные в виде JSON объектов ;D

Да и потом, перед использованием XML файла в коде его придется предварительно распарсить..

mikhailk 10.08.2013 23:12

Цитата:

e4x видимо)
Все равно не понял.
Речь о доступе к данным?

myXml.node.(@param=123) и все такое?

Добавлено через 8 минут
Цитата:

Говоря про XML мы забываем, что API VK и Facebook принимают и отправляют все данные в виде JSON объектов ;D
API ВК отдает и в JSON'е и в XML, принимает параметры запроса напрямую GET'ом.
Нет?

Dukobpa3 10.08.2013 23:22

Апи вк уже не помню, чаще с фб общаюсь, и в ФБ таки жсон везде. Или js Object, который == as3 Object

KumoKairo 10.08.2013 23:30

Цитата:

API ВК отдает и в JSON'е и в XML, принимает параметры запроса напрямую GET'ом.
Ну да, с ВК погорячился немного)

Просто сколько использовал - пользовался возвращаемыми по умолчанию JSON объектами

expl 10.08.2013 23:32

Цитата:

"Родной" JSON работает почти в 2 раза быстрее, чем работал у BloodHound.
Адововцы вроде грозились выпилить алхимию, на которой алгоритм BloodHound работает в новых версиях флешплеера, не в курсе, чем дело закончилось?

mikhailk 11.08.2013 00:04

Цитата:

Просто сколько использовал - пользовался возвращаемыми по умолчанию JSON объектами
У меня есть проекты и с JSON и с XML.
Если речь о том, чтобы передать и как-то заполнить данными объекты, то разницы принципиальной нет.
Если речь о том, чтобы получить и сразу использовать, то XML удобнее.

Вот конкретный пример:
Код:

<imgLibraries>
  <lib title="lib1">
      <img title="img11" tag="tag1" src="" />
      <img title="img12" tag="tag2" src="" />
      <img title="img13" tag="tag2" src="" />
  </lib>
  <lib title="lib2">
      <img title="img21" tag="tag1" src="" />
  </lib>
</imgLibraries>

Скачав этот XML, мы сразу получаем доступ к оглавлению и к картинкам с тэгом tag1 (из разных, прошу заметить, библиотек):

Код AS3:

// оглавление
for(var i:int=0;i<imgLibraries.lib.length();i++)
{
  trace(imgLibraries.lib[i].@title);
}
 
// картинки с тэгом tag1
var imgWithTag1:XMLList = XMLList(imgLibraries.lib.img.(@tag=="tag1"));
for(var j:int=0;j<imgWithTag1.length();j++)
{
  trace(imgWithTag1[j].@title);
}

Получив данные по imgLibraries в JSON, так не сделать.


Другое дело, когда сервер работает с JSON (например, у меня есть проект на платформе nodejs+mongodb, где вообще работать с чем-то, кроме JSON несколько странно).


Часовой пояс GMT +4, время: 03:04.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.