0

InputStreamを持つオブジェクトをシリアル化しようとしています。ByteArrayとしてフレックスクライアントに到着するために必要です。

注-IExternalizableこのクラスは私のものではないため、実装できません。

変換を行うためのカスタムを登録しましたBeanProxyが、機能していないようです。

public class InputStreamBeanProxy extends BeanProxy {
    @Override
    public Object getInstanceToSerialize(Object instance) {

        InputStream stream = (InputStream) instance;
        Byte[] boxOfBytes;
            try {
                byte[] bytes = IOUtils.toByteArray(stream);
                boxOfBytes = new Byte[bytes.length];
                for (int i=0; i < bytes.length; i++)
                {
                   boxOfBytes[i] = bytes[i];
                }
            } catch (IOException e) {
                logger.error("Exception serializing inputStream: ", e);
                throw new RuntimeException(e);
            }
            return boxOfBytes;
       }
}

このプロキシは、起動時に次のように登録されます。

PropertyProxyRegistry.getRegistry().register(InputStream.class, new InputStreamBeanProxy());

このコードにブレークポイントを設定しましたが、期待どおりに呼び出されていることがわかります。ただし、オブジェクトがクライアントに到着すると、入力ストリームはと入力されObject、プロパティは含まれません。

私は何が間違っているのですか?

4

1 に答える 1

0

わかりました-これを解決しました。

問題は、オブジェクトをプロキシするときに、によって返される値がそのgetInstanceToSerialize個々のプロパティに基づいてシリアル化されることです。つまり、オブジェクトとしてシリアル化されます。

ここで「プリミティブ」タイプを返すことはできません(javadocsを引用するため)。プリミティブとは、プリミティブなフラッシュプレーヤーの種類を指します。byte[]プリミティブ型の-として到着したかったのでByteArray、元のアプローチは機能しません。

代わりに、解決策は、InputStreamを直接プロキシするのではなく、所有するクラスのプロパティをプロキシすることでした。

動作するプロキシは次のとおりです。

public class InputStreamBeanProxy extends BeanProxy {

    @Override
    public Object getValue(Object instance, String propertyName) {
        Object value = super.getValue(instance, propertyName);
        if (value instanceof InputStream) {
            value = getByteArray((InputStream) value);
        }
        return value;
    }

    private byte[] getByteArray(InputStream stream) {

        try {
            byte[] bytes = IOUtils.toByteArray(stream);
            return bytes;
        } catch (IOException e) {
            logger.error("Exception serializing inputStream: ", e);
            throw new RuntimeException(e);
        }
    }

}

次のクラスをシリアル化しようとしていたと仮定します。

public class MyThing
{
     InputStream myStream;
     ...
 }

これは次のように登録されます。

PropertyProxyRegistry.getRegistry().register(MyThing.class, new InputStreamBeanProxy());
于 2011-01-06T06:20:15.937 に答える