- PVSM.RU - https://www.pvsm.ru -
[1]Вообще, в InterSystems Caché и динамические объекты, и поддержка JSON есть уже достаточно давно, но в версии 2016.1 они были переосмыслены, а код реализации переведён с COS уровня на уровень ядра/С, что позволило добиться существенного повышения производительности в этих областях. О том, что есть нового и как переходить (а также о том, как сохранить совместимость с предыдущими версиями) я расскажу в этой статье.
И начну с примера. Теперь такой синтаксис — работает и это самое большое нововведение в синтаксисе COS:
Set object = { "property": "val", "property2": 2, "property3": null }
Set array = [ 1, 2, "string", true ]
Как видите JSON теперь является полноправной частью COS. Что же происходит при подобном присвоении? Объект object становится экземпляром класса %Library.Object [2], а array является экземпляром класса %Library.Array [3]. Они оба являются динамическими объектами.
Динамические объекты в Cache были и раньше — в виде класса %ZEN.proxyObject [4], но теперь код перемещён в ядро, за счёт чего достигнут значительный прирост по скорости. Все классы динамических объектов наследуются от %Library.AbstractObject [5], который предоставляет следующую функциональность:
Итак, вы хотите перейти от %ZEN.proxyObject [4] и различных наследников %Collection.AbstractIterator [6] к использованию наследников %Library.AbstractObject? Это несложно и есть несколько методов:
Использование первого метода в общем-то очевидно, а вот на двух других остановимся поподробнее.
Примерный код набора макросов, которые в зависимости от наличия %Library.AbstractObject работают либо с новым, либо с прежним классом динамических объектов.
В Cache версии 2016.1+ скомпилируется в int такой код:
set obj = ##class(%Library.Object).%New()
set obj.prop = "val"
w obj.$toJSON()
set dtList = ##class(%Library.Array).%New()
set a = 1
do dtList.$push(a)
do dtList.$push("a")
w dtList.$toJSON()
А в предыдущих версиях в:
set obj = ##class(%ZEN.proxyObject).%New()
set obj.prop = "val"
do obj.%ToJSON()
set dtList = ##class(%Library.ListOfDataTypes).%New()
set a = 1
do dtList.Insert(a)
do dtList.Insert("a")
do ##class(%ZEN.Auxiliary.jsonProvider).%ObjectToJSON(dtList)
Альтернативным вариантом является создание класса, абстрагирующего используемый динамический объект, например:
Использование полностью аналогично обычному классу:
Set obj = ##class(Utils.DynamicObject).%New()
Set obj.prop = "val"
Do obj.ToJSON()
Решать вам. Вариант с классом выглядеть привычнее, вариант с макросами будет несколько быстрее за счёт отсутствия промежуточных вызовов. Для проекта MDX2JSON [9] я выбрал вариант с макросами. Переход прошел быстро и безболезненно [10].
Скорость генерации JSON возросла на порядок. В проекте MDX2JSON есть тесты скорости [11] генерации JSON. Скачайте и убедитесь!
Новые динамические объекты и улучшения в поддержке JSON позволяют ускорить работу ваших приложений.
» Документация [12]
» Статья на community.intersystems.com о JSON [13]
» Класс Utils.DynamicObject [14]
Автор: InterSystems
Источник [15]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/117347
Ссылки в тексте:
[1] Image: http://habrahabr.ru/company/intersystems/blog/268767/
[2] %Library.Object: http://docs.intersystems.com/cache20161/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25Library.Object
[3] %Library.Array: http://docs.intersystems.com/cache20161/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25Library.Array
[4] %ZEN.proxyObject: http://docs.intersystems.com/cache20161/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25ZEN.proxyObject
[5] %Library.AbstractObject: http://docs.intersystems.com/cache20161/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25Library.AbstractObject
[6] %Collection.AbstractIterator: http://docs.intersystems.com/cache20161/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25Collection.AbstractIterator
[7] писал: http://habrahabr.ru/company/intersystems/blog/258081/
[8] пример: http://habrahabr.ru/company/intersystems/blog/258805/
[9] MDX2JSON: https://github.com/intersystems-ru/Cache-MDX2JSON
[10] быстро и безболезненно: https://github.com/intersystems-ru/Cache-MDX2JSON/pull/48
[11] тесты скорости: https://github.com/intersystems-ru/Cache-MDX2JSON/blob/master/MDX2JSON/Tests.cls.xml#L123
[12] Документация: http://docs.intersystems.com/cache20161/csp/docbook/DocBook.UI.Page.cls?KEY=GJSON
[13] Статья на community.intersystems.com о JSON: https://community.intersystems.com/post/introducing-new-json-capabilities-cach%C3%A9-20161
[14] Класс Utils.DynamicObject: https://gist.githubusercontent.com/eduard93/b39aaaba759be255db0a/raw/4763586cbf94aa8532df5f8ebfbe6d4d0f302741/DynamicObject.xml
[15] Источник: https://habrahabr.ru/post/272059/
Нажмите здесь для печати.