package org.greencheek.spy.extensions; import de.ruedigermoeller.serialization.FSTConfiguration; import de.ruedigermoeller.serialization.FSTObjectInput; import de.ruedigermoeller.serialization.FSTObjectOutput; import net.spy.memcached.CachedData; import java.io.IOException; /** * Uses https://github.com/RuedigerMoeller/fast-serialization for serialization */ public class FastSerializingTranscoder extends SerializingTranscoder { public static final boolean DEFAULT_SHARE_REFERENCES = true; public static final int DEFAULT_COMPRESSION_THRESHOLD = 4096; public static final int MAX_CONTENT_SIZE_IN_BYTES = CachedData.MAX_SIZE; // ! reuse this Object, it caches metadata. Performance degrades massively // if you create a new Configuration Object with each serialization ! final FSTConfiguration conf; public FastSerializingTranscoder() { this(DEFAULT_SHARE_REFERENCES,null); } public FastSerializingTranscoder(int maxContentLengthInBytes, int compressionThresholdInBytes) { this(DEFAULT_SHARE_REFERENCES,null,maxContentLengthInBytes,compressionThresholdInBytes); } public FastSerializingTranscoder(Class[] classesKnownToBeSerialized) { this(DEFAULT_SHARE_REFERENCES,classesKnownToBeSerialized); } public FastSerializingTranscoder(boolean shareReferences, Class[] classesKnownToBeSerialized) { this(shareReferences,classesKnownToBeSerialized,MAX_CONTENT_SIZE_IN_BYTES,DEFAULT_COMPRESSION_THRESHOLD); } public FastSerializingTranscoder(boolean shareReferences, Class[] classesKnownToBeSerialized, int maxContentLengthInBytes, int compressionThresholdInBytes) { super(maxContentLengthInBytes,compressionThresholdInBytes); conf = FSTConfiguration.createDefaultConfiguration(); conf.setShareReferences(shareReferences); if (classesKnownToBeSerialized != null && classesKnownToBeSerialized.length > 0) { conf.registerClass(classesKnownToBeSerialized); } } /** * Get the object represented by the given serialized bytes. */ protected Object deserialize(byte[] in) { Object rv = null; try { if (in != null) { FSTObjectInput is = conf.getObjectInput(in); rv = is.readObject(); } } catch (IOException e) { getLogger().warn("Caught IOException decoding %d bytes of data", in == null ? 0 : in.length, e); } catch (ClassNotFoundException e) { getLogger().warn("Caught CNFE decoding %d bytes of data", in == null ? 0 : in.length, e); } return rv; } /** * Get the bytes representing the given serialized object. */ protected byte[] serialize(Object o) { if (o == null) { throw new NullPointerException("Can't serialize null"); } byte[] rv = null; try { FSTObjectOutput os = conf.getObjectOutput(); os.writeObject(o); os.flush(); rv = os.getCopyOfWrittenBuffer(); } catch (IOException e) { throw new IllegalArgumentException("Non-serializable object", e); } return rv; } }