Red5 выдает ошибку загрузки класса при использовании пользовательского класса в качестве SharedObject

Из приложения AS3 Flash я пытаюсь установить SharedObject для экземпляра пользовательского класса, который я создал. Из того, что я могу сказать, как только я вызываю sharedObject.setProperty("propertyName", myCustomClass), Red5 выдает «Ошибка загрузки класса», а затем отключает клиент, потому что декодирование не удалось.

Кажется, у многих других людей были подобные проблемы, но все, что я нашел, касалось создания SharedObjects на стороне сервера. У меня возникли проблемы с поиском информации о создании SharedObject на стороне клиента (в приложении Flash). Я просто использую включенное «живое» приложение Red5 из коробки.

Вот фактическая ошибка, которую я вижу в журналах Red5...

[ERROR] [NioProcessor-7] org.red5.io.amf.Input - Error loading class: com.striparcade.API.Player
[ERROR] [NioProcessor-7] org.red5.server.net.rtmp.codec.RTMPProtocolDecoder - Error decoding buffer

com.striparcade.API.Player — это рассматриваемый пользовательский класс. Этот класс реализует IExternalizable, включает методы writeExternal() и readExternal() и вызов registerClassAlias(). Кажется, сериализуется просто отлично.

Конечно, мне не нужно воссоздавать этот класс и в приложении Red5? Разве Red5 не должен просто брать данные и передавать их другим клиентам, когда это необходимо? Есть идеи, что мне не хватает?

Используя Red5 1.0.1, кстати. Я вижу, что многие ошибки, связанные с кодировкой AMF3, были исправлены в версии .7. Кроме того, прямо сейчас просто тестирую локально на машине с Windows 7.


person strip-arcade.com    schedule 24.05.2013    source источник
comment
См. мой ответ на этот вопрос: stackoverflow.com/questions/15667848/   -  person BadFeelingAboutThis    schedule 24.05.2013
comment
Я уже звоню registerClassAlias.   -  person strip-arcade.com    schedule 24.05.2013
comment
вам нужно зарегистрировать КАЖДЫЙ класс, на который можно ссылаться внутри вашего Player класса (и любых классов внутри этих классов), вы уверены, что делаете это? У меня нет опыта работы с Red5, поэтому, если проблема заключается в этом, кто-то другой должен будет прокомментировать   -  person BadFeelingAboutThis    schedule 25.05.2013
comment
Да, я свел это к простому CustomClass с одним свойством String для целей тестирования и получил ту же проблему. Похоже, проблема связана с Red5 или, по крайней мере, с включенным живым приложением Red5.   -  person strip-arcade.com    schedule 25.05.2013


Ответы (2)


Убедитесь, что вы вызываете registerClassAlias("com.striparcade.API.Player",com.striparcade.API.Player), прежде чем что-либо делать с SharedObject и этим классом. Если все в порядке, убедитесь, что вы можете вызвать getDefinitionByName("com.striparcade.API.Player") и получить ненулевое значение прямо перед чтением SO. Возможно, определение класса либо не скомпилировано в SWF, либо включено в более поздние фреймы, чем те, в которых вы читали SO.

person Vesper    schedule 24.05.2013
comment
Я переместил registerClassAlias("com.striparcade.API.Player",com.striparcade.API.Player) в первую строку конструктора в моем основном классе. getDefinitionByName("com.striparcade.API.Player") возвращает [class Player] прямо перед вызовом setProperty, содержащего экземпляр Player. Вроде все правильно, но в логах Red5 все та же ошибка. - person strip-arcade.com; 24.05.2013

Я решил проблему, но я не эксперт по Red5, так что отнеситесь к следующему объяснению с долей скептицизма и поправьте меня, если я ошибаюсь... Похоже, либо Red5, либо «живое» приложение, включенное в Red5 , пытается создать экземпляр любых объектов, которые он получает через SharedObject на стороне сервера. Итак, я считаю, что вам действительно нужно будет реплицировать в Java любые CustomClasses, которыми вы делитесь со стороны клиента в AS3. Мне это кажется очень странным, но это все, что я могу собрать, и это объясняет журналы ошибок Red5.

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

Простой обходной путь — «обернуть» все, чем вы делитесь, в ByteArray, а затем развернуть его при извлечении. Red5, кажется, не жалуется на ByteArrays и с радостью передает их клиенту, не зная, что внутри. Вот пара функций, которые я придумал, чтобы справиться с этим...

    private function setRed5Property(propertyName:String, data:Object):void
    {
        var dataBytes:ByteArray = new ByteArray();
        dataBytes.writeObject(data);

        _red5SharedObject.setProperty(propertyName, dataBytes);
        _red5SharedObject.setDirty(propertyName);
    }

    private function getRed5Property(propertyName:String):Object
    {
        var dataBytes:ByteArray = new ByteArray();
        dataBytes.writeBytes(_red5SharedObject.data[propertyName]);
        dataBytes.position = 0;

        return dataBytes.readObject() as Object;
    }
person strip-arcade.com    schedule 25.05.2013