package mil.nga.giat.geowave.analytic.kryo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import mil.nga.giat.geowave.adapter.vector.FeatureWritable; import org.opengis.feature.simple.SimpleFeature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; public class FeatureSerializer extends Serializer<SimpleFeature> { final static Logger LOGGER = LoggerFactory.getLogger(FeatureSerializer.class); @Override public SimpleFeature read( final Kryo arg0, final Input arg1, final Class<SimpleFeature> arg2 ) { final FeatureWritable fw = new FeatureWritable(); final byte[] data = arg1.readBytes(arg1.readInt()); try (DataInputStream is = new DataInputStream( new ByteArrayInputStream( data))) { fw.readFields(is); } catch (final IOException e) { LOGGER.error( "Cannot deserialize Simple Feature", e); return null; } return fw.getFeature(); } @Override public void write( final Kryo arg0, final Output arg1, final SimpleFeature arg2 ) { final FeatureWritable fw = new FeatureWritable( arg2.getFeatureType()); fw.setFeature(arg2); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); try (DataOutputStream os = new DataOutputStream( bos)) { fw.write(os); os.flush(); final byte[] data = bos.toByteArray(); arg1.writeInt(data.length); arg1.write(data); } catch (final IOException e) { LOGGER.error( "Cannot serialize Simple Feature", e); } } }