从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计算机上进行本地测试。
答案 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;
}