Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > dendrit

Оценить эту запись

XML-Object mapping

Запись от dendrit размещена 06.06.2014 в 01:12

Написал AS3-библиотеку AStream, которая занимается преобразованием типизированных объектов в XML и обратно.
API я постарался сделать похожим на XStream.

Основные особенности:
  1. Воссоздание типизированного объекта
  2. Объект может содержать циклические ссылки
  3. Вид XML можно задать метаданными и программно
  4. Написана на чистом AS3, не зависит от Flex
  5. Коллекции, реализующие IList, Array,Vector
  6. Map-ы: Object и Dictionary
  7. Поддержка Enum, ByteArray, IExternalizable

В AStream перечислением считается любой класс, унаследованный от as3.lang.Enum. Название, передаваемое в конструктор, и название статического поля должны совпадать.

Код AS3:
package com.example.domain {
import as3.lang.Enum;
 
public class UserRole extends Enum {
    public static const ADMINISTRATOR:UserRole = new UserRole("ADMINISTRATOR");
    public static const OPERATOR:UserRole = new UserRole("OPERATOR");
 
    public function UserRole(name:String) {
        super(name);
    }
}
}
К сожалению, во Flash нельзя получить список полей объекта в том порядке, в котором они объявлены. Более того, от запуска к запуску (или от компиляции к компиляции) порядок может меняться!
Метадата AStreamOrder задает порядок следования свойств.

Код AS3:
package com.example.domain {
[AStreamAlias("User")]
public class User {
    private var _name:String;
 
    [AStreamOrder(10)]
    public var id:Number;
    [AStreamOrder(30)]
    public var role:UserRole;
 
    public function User() {
    }
 
    [AStreamOrder(20)]
    public function get name():String {
        return _name;
    }
 
    public function set name(value:String):void {
        _name = value;
    }
 
    public function toString():String {
        return "User{_name=" + String(_name) + ",id=" + String(id) + ",role=" + String(role) + "}";
    }
}
}
AStream по умолчанию не обрабатывает метаданные автоматически.
Если включено автоопределение метаданных, то AStream при преобразовании объекта в XML обработает все классы, на которые ссылается объект.
Поэтому нет проблем с преобразованием объекта в XML: AStream знает типы наперед.
А вот с преобразованием XML в объект могут возникнуть трудности, если библиотека еще не знает о псевдониме (alias) класса.

Код AS3:
const aStream:AStream = new AStream();
aStream.processMetadata(User);
//or aStream.autodetectMetadata(true);
 
const user:User = new User();
user.id = 1;
user.name = "Ivanov Ivan";
user.role = UserRole.ADMINISTRATOR;
 
const xml:XML = aStream.toXML(user);
/* xml.toXMLString()
 <User>
    <id>1</id>
    <name>Ivanov Ivan</name>
    <role>ADMINISTRATOR</role>
 </User> */
 
const restoredUser:User = aStream.fromXML(xml) as User;
/* restoredUser.toString()
User{_name=Ivanov Ivan,id=1,role=ADMINISTRATOR} */
Всего комментариев 7

Комментарии

Старый 12.06.2014 14:28 Babylon вне форума
Babylon
 
Аватар для Babylon
Осталось сделать то же самое на JSON
Старый 12.06.2014 21:50 LifeIsRhythm вне форума
LifeIsRhythm
Было бы просто здорово!
Старый 22.06.2014 22:23 dendrit вне форума
dendrit
 
Аватар для dendrit
Для JSON уже есть несколько готовый решений. Например, это.
Я уже отвечал на форуме по этому поводу:

Цитата:
Но в стандарте JSON нет ссылок на элементы. Если бы я сделал свое расширение стандарта для ссылок, то это привело бы к тому, что другими библиотеками распарсить JSON удавалось бы не всегда.
Основной мотивацией для разработки AStream было создание клиентского приложения, способного общаться с Java-сервером.
Старый 23.06.2014 13:15 Котяра вне форума
Котяра
 
Аватар для Котяра
Идея похожа на protoBuf, только не бинарный, а xml - подобный.
Старый 23.06.2014 13:48 alatar вне форума
alatar
 
Аватар для alatar
Цитата:
Для JSON уже есть несколько готовый решений.
Для XML тоже.
Старый 23.06.2014 18:47 dendrit вне форума
dendrit
 
Аватар для dendrit
Вы не kemsky случайно?
Я пересмотрел несколько библиотек для преобразования XML<->AS3. Некоторое время пользовался Spicefactory XML Mapper.

И почти у всех были проблемы либо с циклическими зависимостями, либо с восстановлением типа объекта.
FlexXB не понравился по API. А asx3m не полностью соответствует XStream, и задачи по проекту не исправляются уже около 5 лет.
Старый 23.06.2014 20:23 alatar вне форума
alatar
 
Аватар для alatar
Цитата:
Вы не kemsky случайно?
Нет. И даже не пользовался этой библиотекой.
 
Последние записи от dendrit

 


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


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