2013-05-24 4 views
1

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

Кажется, что у многих других людей были подобные проблемы, но все, что я нашел, - это создание SharedObjects на стороне сервера. У меня возникли проблемы с поиском возможности создания SharedObject на стороне клиента (в приложении Flash). Я просто использую включенное приложение «Live» 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.

+0

Смотрите мой ответ на этот вопрос: http://stackoverflow.com/questions/15667848/as3-for-ios-how-to-serialize -an-array-and-then-save-it/15668079 # 15668079 – BadFeelingAboutThis

+0

Я уже вызываю 'registerClassAlias'. –

+0

вам нужно зарегистрировать КАЖДЫЙ класс, на который можно ссылаться внутри класса 'Player' (и любых классов внутри этих классов), вы уверены, что это так? У меня нет опыта работы с Red5, поэтому, если проблема в том, что кто-то еще должен будет комментировать – BadFeelingAboutThis

ответ

0

Я решил проблему, но я не эксперт по Red5, поэтому соберите соль с солью и исправьте меня, если я ошибаюсь ... Кажется, что либо Red5, либо «живая», приложение, включенное в Red5, пытается создать экземпляр любых объектов, которые он получает через SharedObject на стороне сервера. Итак, я считаю, что вам действительно нужно будет реплицировать в Java любые пользовательские классы, которые вы используете с клиентской стороны в 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; 
    } 
0

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

+0

Я переместил 'registerClassAlias ​​(« com.striparcade.API.Player », com.striparcade.API.Player) 'в первую строку конструктора в моем основном классе. 'getDefinitionByName (" com.striparcade.API.Player ")' возвращает '[класс Player]' прямо перед вызовом 'setProperty', содержащим экземпляр Player. Все выглядит правильно, но все равно такая же ошибка в журналах Red5. –