@Override
    public void serialize(Object o, SerializationContext context) {
        BitField fieldParams = (BitField)context.getAnnotation(BitField.class);
        int length = BitUtility.getBitLength(fieldParams);
        if (length > -1 && (length & 3) > 0) {
            throw new RuntimeException("Fixed length (footprint) must be a multiple of 8.");
        }
        
        long value;
        if (o instanceof Integer) {
            value = (Integer)o;
        } else if (o instanceof Byte) {
            value = (Byte)o;
        } else if (o instanceof Long) {
            value = (Long)o;
        } else {
            throw new RuntimeException("Value has unknown type [" + o.getClass().getName() + "].");
        }
        
        BitBuffer bitBuffer = context.getBuffer();
        byte[] buffer = bitBuffer.getBuffer();
        long offsetPosition = bitBuffer.getBitOffset() + bitBuffer.getBitPosition();
        
        int bytesNeeded = (length == -1)
                ? (int)Math.ceil(Math.log(value) / Math.log(2) / 7)
                : length >> 3;
        
        int bytePosition = (int)(offsetPosition >> 3);
        for (int i=bytesNeeded - 1; i>=0; i--) {
            buffer[bytePosition++] = (byte)((i == 0 ? 0 : 0x80) | ((value >> i * 7) & 0x7f));
        }
        
        bitBuffer.moveBitPosition(bytesNeeded << 3);
    }