2013-11-08 3 views
0

В Нетти 3 мы исполнение LITTLE_ENDIAN ChannelBuffers на каждом конце с помощьюУстановка ByteBuf порядка байтов в Netty4

bootstrap.setOption("child.bufferFactory", new HeapChannelBufferFactory(ByteOrder.LITTLE_ENDIAN)); 

но в Нетти 4, конфигурация ByteBuf теперь, кажется, через ChannelOption.ALLOCATOR:

bootstrap.option(ChannelOption.ALLOCATOR, someAllocator); 

Все, что мы действительно хотим сделать, это украсить UnpooledByteBufAllocator, но он окончательный, и методы , которые нам нужно украсить, защищены, поэтому мы не можем расширить класс или делегировать его. Мы пришлось прибегнуть к прокси подход:

private static class AllocatorProxyHandler implements InvocationHandler { 
    private final ByteBufAllocator allocator; 

    public AllocatorProxyHandler(ByteBufAllocator allocator) { 
     this.allocator = allocator; 
    } 

    public static ByteBufAllocator proxy(ByteBufAllocator allocator) { 
     return (ByteBufAllocator) Proxy.newProxyInstance(AllocatorProxyHandler.class.getClassLoader(), new Class[]{ByteBufAllocator.class}, new AllocatorProxyHandler(allocator)); 
    } 

    @Override 
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
     Object result = method.invoke(allocator, args); 
     if (result instanceof ByteBuf) { 
      return ((ByteBuf) result).order(ByteOrder.LITTLE_ENDIAN); 
     } else { 
      return result; 
     } 
    } 
} 

установки опции Bootstrap так:

bootstrap.option(ChannelOption.ALLOCATOR, AllocatorProxyHandler.proxy(UnpooledByteBufAllocator.DEFAULT)); 

Есть ли какой-то другой (лучше) способ сделать это нам не хватает?

ответ

1

Netty 4.0's ByteBuf по умолчанию является big-endian. Вы можете получить прямой порядок байтов вид ByteBuf с использованием метода order(ByteOrder):

ByteBuf buf = ctx.alloc().buffer(); 
ByteBuf leBuf = buf.order(ByteOrder.LITTLE_ENDIAN); 
leBuf.getByte(...); 
... 

Это сделано, чтобы избежать путаницы, вызванной сохраняя порядок следования байтов в качестве переменной состояния. Если есть веская причина, по которой он должен предоставить способ изменить порядок байтов по умолчанию, сообщите нам, чтобы мы могли пересмотреть это решение.

+0

Возможно, полезны функции доступа, такие как getIntLE или getIntBE? – Climax

+0

@Climax Да, это план на самом деле. – trustin

+0

это отличная новость – Climax

Смежные вопросы