XML-Object mapping
Запись от dendrit размещена 06.06.2014 в 01:12
Написал AS3-библиотеку AStream, которая занимается преобразованием типизированных объектов в XML и обратно.
API я постарался сделать похожим на XStream.
Основные особенности:
- Воссоздание типизированного объекта
- Объект может содержать циклические ссылки
- Вид XML можно задать метаданными и программно
- Написана на чистом AS3, не зависит от Flex
- Коллекции, реализующие IList, Array,Vector
- Map-ы: Object и Dictionary
- Поддержка Enum, ByteArray, IExternalizable
В AStream перечислением считается любой класс, унаследованный от as3.lang.Enum. Название, передаваемое в конструктор, и название статического поля должны совпадать.
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); } } }
Метадата AStreamOrder задает порядок следования свойств.
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 при преобразовании объекта в XML обработает все классы, на которые ссылается объект.
Поэтому нет проблем с преобразованием объекта в XML: AStream знает типы наперед.
А вот с преобразованием XML в объект могут возникнуть трудности, если библиотека еще не знает о псевдониме (alias) класса.
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 | |
Осталось сделать то же самое на JSON
|
12.06.2014 21:50 | |
Было бы просто здорово!
|
22.06.2014 22:23 | |
Для JSON уже есть несколько готовый решений. Например, это.
Я уже отвечал на форуме по этому поводу: Цитата:
Но в стандарте JSON нет ссылок на элементы. Если бы я сделал свое расширение стандарта для ссылок, то это привело бы к тому, что другими библиотеками распарсить JSON удавалось бы не всегда.
Основной мотивацией для разработки AStream было создание клиентского приложения, способного общаться с Java-сервером. |
23.06.2014 13:15 | |
Идея похожа на protoBuf, только не бинарный, а xml - подобный.
|
23.06.2014 13:48 | |
Цитата:
Для JSON уже есть несколько готовый решений.
|
23.06.2014 18:47 | |
Вы не kemsky случайно?
Я пересмотрел несколько библиотек для преобразования XML<->AS3. Некоторое время пользовался Spicefactory XML Mapper. И почти у всех были проблемы либо с циклическими зависимостями, либо с восстановлением типа объекта. FlexXB не понравился по API. А asx3m не полностью соответствует XStream, и задачи по проекту не исправляются уже около 5 лет. |
23.06.2014 20:23 | |
Цитата:
Вы не kemsky случайно?
|
Последние записи от dendrit
- XML-Object mapping (06.06.2014)