0

我正在尝试序列化具有 InputStream 的对象。我需要它以字节数组的形式到达 flex 客户端。

注意 - 我不能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)。通过原始,它们指的是原始的 flashplayer 类型。由于我想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 回答