Как [RemoteClass] работает в Flex Actionscript, можно ли использовать его для пользовательской привязки данных?

Actionscript поддерживает тег метаданных [RemoteClass], который используется в BlazeDS для предоставления подсказок по привязке данных для сортировки двоичных объектов AMF из Java в BlazeDS.

Например:

Java: образец пакета;

public class UserInfo
{
    private String userName;

    public String getUserName()
    {
        return userName;
    }

    public void setUserName(String value)
    {
        userName = value;
    }
}

Сценарий действия:

[Bindable]
[RemoteClass(alias="sample.UserInfo")]
public class UserInfo
{
    public var userName:String=”";
}

Как именно [RemoteClass] реализован в среде BlazeDS, и не могли бы вы переопределить это поведение и предоставить пользовательскую среду удаленного взаимодействия с привязкой данных (например, систему передачи сообщений JSON), которую вы могли бы привязать к классу Actionscript [Bindable], [RemoteClass] ?


person Dougnukem    schedule 04.11.2009    source источник


Ответы (3)


[RemoteClass(alias="com.example.MyClass")] — это сокращение Flex для вызова flash.net.registerClassAlias() :

public function registerClassAlias(aliasName:String, classObject:Class):void

Чтобы получить доступ к этим зарегистрированным классам псевдонимов во время выполнения (для написания пользовательской среды сериализации данных JSON), вы можете вызвать:

getClassByAlias(aliasName:String): Класс Ищет класс, который ранее имел псевдоним, зарегистрированный с помощью вызова метода registerClassAlias().

Для исходящего кодирования из AS в Java вам необходимо получить псевдоним имени класса, вы можете сделать это, вызвав flash.utils.describeType() и используйте "отражение" в классе вашего объекта Actionscript для запроса атрибутов, свойств и методов объекта.

Например, следующий фрагмент кода для ObjectCodec.as, похоже, извлекает атрибут псевдонима с помощью "@":

override protected function encodeComplex(o:Object, b:IBinary, context:IContext=null):void
{
        var desc:XML = describeType(o);
        var classAlias:String = desc.@alias;
        //...
}
person Dougnukem    schedule 04.11.2009
comment
На сайте Adobe больше нет информации о методе registerClassAlias; есть сообщение на форумах Adobe, в котором говорится об отсутствии документации. - person supervacuo; 06.06.2012
comment
@supervacuo: справка .adobe.com/en_US/FlashPlatform/reference/actionscript/3/ - person BlueRaja - Danny Pflughoeft; 25.05.2013

[RemoteClass] используется только на стороне Flex. Все, что он на самом деле делает, это вызывает flash.net .registerClassAlias() для установки сопоставления между локальным объектом и именем удаленного класса.

person James Ward    schedule 04.11.2009
comment
Итак, есть ли способ получить доступ к списку flash.net.registerClassAlias(). Я пытаюсь написать свой собственный удаленный доступ с использованием сообщений JSON, поэтому я не использую интерфейсы Flex Producer/Consumer или IDataInput, IDataOutput. Мне нужно иметь возможность искать класс Flex по имени удаленного класса java и создавать его. - person Dougnukem; 04.11.2009

Вы можете использовать аргумент компилятора -keep-generated-actionscript, чтобы увидеть, какой код сгенерирован и как он работает.

person nicoulaj    schedule 04.11.2009