@Override
  protected byte[] defaultTypeDataToBinary() {
    final String encodedType = DataUtilities.encodeType(featureType);
    final String typeName = featureType.getTypeName();
    final byte[] typeNameBytes = StringUtils.stringToBinary(typeName);
    final byte[] encodedTypeBytes = StringUtils.stringToBinary(encodedType);

    byte[] attrBytes = new byte[0];

    final SimpleFeatureUserDataConfigurationSet userDataConfiguration =
        new SimpleFeatureUserDataConfigurationSet();
    userDataConfiguration.addConfigurations(typeName, new TimeDescriptorConfiguration());
    userDataConfiguration.addConfigurations(
        typeName, new SimpleFeatureStatsConfigurationCollection());
    userDataConfiguration.addConfigurations(typeName, new SimpleFeaturePrimaryIndexConfiguration());
    userDataConfiguration.configureFromType(featureType);

    try {
      attrBytes = StringUtils.stringToBinary(userDataConfiguration.asJsonString());
    } catch (final IOException e) {
      LOGGER.error("Failure to encode simple feature user data configuration", e);
    }

    final ByteBuffer buf =
        ByteBuffer.allocate(
            encodedTypeBytes.length
                + typeNameBytes.length
                + adapterId.getBytes().length
                + attrBytes.length
                + 24);

    buf.putInt(0); // a signal for the new version
    buf.putInt(typeNameBytes.length);
    buf.putInt(0); // old visibility (backward compatibility)
    buf.putInt(attrBytes.length);
    buf.putInt(encodedTypeBytes.length);
    buf.putInt(adapterId.getBytes().length);
    buf.put(typeNameBytes);
    buf.put(attrBytes);
    buf.put(encodedTypeBytes);
    buf.put(adapterId.getBytes());
    return buf.array();
  }