package com.feedly.cassandra.entity; import java.lang.reflect.Method; import java.nio.ByteBuffer; import java.util.Arrays; import me.prettyprint.cassandra.serializers.AbstractSerializer; import me.prettyprint.cassandra.serializers.StringSerializer; import org.apache.cassandra.db.migration.avro.IndexType; public class EnumSerializer extends AbstractSerializer<Enum<?>> { private final StringSerializer _ser = StringSerializer.get(); private final Class<? extends Enum<?>> _clazz; private final Method _valueOf; public EnumSerializer(Class<? extends Enum<?>> enumClass) { _clazz = enumClass; try { _valueOf = _clazz.getMethod("valueOf", String.class); } catch(NoSuchMethodException ex) { throw new IllegalStateException(ex); } } @Override public ByteBuffer toByteBuffer(Enum<?> obj) { return _ser.toByteBuffer(obj.name()); } @Override public Enum<?> fromByteBuffer(ByteBuffer byteBuffer) { String name = _ser.fromByteBuffer(byteBuffer); if(name == null || "".equals(name)) return null; try { return (Enum<?>) _valueOf.invoke(null, name); } catch(Exception ex) { throw new IllegalStateException(ex); } } public static void main(String[] args) throws Throwable { EnumSerializer ser = new EnumSerializer(IndexType.class); byte[] bytes = ser.toBytes(IndexType.CUSTOM); System.out.println(Arrays.toString(bytes)); System.out.println(ser.fromBytes(bytes)); } }