@Override
    public T decode(byte[] data) throws ConverterException {
        ByteArrayInputStream bin = new ByteArrayInputStream(data);
        try {
            Constructor<T> defaultConstructor = converteClass.getDeclaredConstructor();
            defaultConstructor.setAccessible(true);
            T obj = defaultConstructor.newInstance();
            CodedInputStream input = CodedInputStream.newInstance(bin);
            int tag;
            while ((tag = input.readTag()) != 0) {
                tag = WireFormat.getTagFieldNumber(tag);
                FieldConverter fieldBufferSetter = idIndexedFieldArray.get(tag);
                fieldBufferSetter.decode(obj, input);
            }
            return obj;
        } catch (InstantiationException e) {
            throw new ConverterException("Class default contructor thrown exception "
                    + converteClass.getName(), e);
        } catch (IllegalAccessException e) {
            throw new ConverterException("Class does not provide an accesible default contructor "
                    + converteClass.getName(), e);
        } catch (IOException e) {
            throw new ConverterException("Could not read from byte array! " + converteClass.getName(), e);
        } catch (SecurityException e) {
            throw new ConverterException("Could not access constructor " + converteClass.getName(), e);
        } catch (NoSuchMethodException e) {
            throw new ConverterException("Default constructor does not exist in class "
                    + converteClass.getName(), e);
        } catch (InvocationTargetException e) {
            throw new ConverterException("Constructor thrown exception " + converteClass.getName(), e);
        } finally {
            try {
                bin.close();
            } catch (IOException e) {
                throw new ConverterException("Could not close input stream!", e);
            }
        }
    }