当使用自定义类作为SharedObject时,Red5抛出“加载类时出错”

时间:2013-05-24 05:24:55

标签: actionscript-3 red5 amf shared-objects

从AS3 Flash应用程序,我正在尝试将SharedObject设置为我创建的自定义类的实例。据我所知,一旦我调用sharedObject.setProperty("propertyName", myCustomClass) Red5抛出“加载类错误”,然后断开客户端,因为解码失败。

似乎很多其他人都有类似的问题,但我发现的一切都是关于在服务器端创建SharedObjects。我在查找客户端(在Flash应用程序中)创建SharedObject时遇到了很多麻烦。我只是使用随附的“现场”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计算机上进行本地测试。

2 个答案:

答案 0 :(得分:0)

确保在对SharedObject和此类执行任何操作之前调用registerClassAlias("com.striparcade.API.Player",com.striparcade.API.Player)。如果没问题,请确保您能够在读取SO之前调用getDefinitionByName("com.striparcade.API.Player")并接收非空值。类定义可能未编译到SWF中,或者包含在后面的帧中,而不是读取SO的位置。

答案 1 :(得分:0)

我已经解决了这个问题,但我不是Red5专家,所以如果我错了就拿下以下的解释并纠正我......看来Red5或者是“live”应用程序包含在Red5中,尝试通过服务器端的SharedObject实例化它接收的任何对象。所以,我相信你实际上需要在Java中复制你在AS3中从客户端共享的任何CustomClasses。对我来说似乎很奇怪,但这就是我所能收集到的,这将解释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;
    }