1

从 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 编码的错误都在 0.7 版左右得到修复。此外,现在只是在 Windows 7 机器上进行本地测试。

4

2 回答 2

0

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

于 2013-05-24T05:33:21.813 回答
0

我已经解决了这个问题,但我不是 Red5 专家,所以如果我错了,请接受以下解释并纠正我......似乎 Red5 或 Red5 附带的“实时”应用程序, 尝试实例化它通过服务器端的 SharedObject 接收到的任何对象。因此,我相信您实际上需要在 Java 中复制您从 AS3 的客户端共享的任何 CustomClass。对我来说似乎很奇怪,但这就是我能收集到的全部信息,这可以解释 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;
    }
于 2013-05-25T21:35:26.087 回答