Flex / LCDS: сериализация InputStream в виде ByteArray с использованием BeanProxy - PullRequest
0 голосов
/ 06 января 2011

Я пытаюсь сериализовать объект, который имеет 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 и не содержит свойств.

Что я делаю не так?

1 Ответ

0 голосов
/ 06 января 2011

Хорошо - решил это.

Проблема заключается в том, что при проксировании объекта значение, возвращаемое 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());
...