1

AS3 Flash アプリから、作成したカスタム クラスのインスタンスに SharedObject を設定しようとしています。私が知る限り、sharedObject.setProperty("propertyName", myCustomClass)Red5 を呼び出すとすぐに「Error loading class」がスローされ、デコードに失敗したためクライアントが切断されます。

他の多くの人が同様の問題を抱えているようですが、私が見つけたのは、サーバー側で 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 マシンでローカルにテストしています。

4

2 に答える 2

0

私は問題を解決しましたが、私は Red5 の専門家ではないので、次の説明を一粒の塩で理解して、間違っている場合は訂正してください... Red5、または Red5 に含まれる「ライブ」アプリケーションのいずれかのようです、サーバー側の SharedObject を介して受信したオブジェクトをインスタンス化しようとします。したがって、AS3 でクライアント側から共有している CustomClasses が何であれ、Java で実際にレプリケートする必要があると思います。私には本当に奇妙に思えますが、収集できるのはこれだけで、Red5 エラー ログの説明になります。

他のプログラマーにクライアント側のコードを API として取り込ませ、サーバー側の詳細を抽象化させる予定なので、これは私のニーズには受け入れられませんでした。 .

簡単な回避策は、ByteArray で共有しているものを「ラップ」し、それを取得するときにラップを解除することです。Red5 は ByteArray について不平を言うようには見えず、中身を知らずに喜んでクライアントにブロードキャストします。これを処理するために作成したいくつかの関数を次に示します...

    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 に答える