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