package ezdb.serde; import java.io.Serializable; import java.util.Date; import java.util.Calendar; public class TypeDelegateSerde<O> implements Serde<O> { private final Serde<O> delegate; @SuppressWarnings("unchecked") public TypeDelegateSerde(final Class<O> type) { delegate = (Serde<O>) newDelegate(type); } protected Serde<?> newDelegate(final Class<O> type) { if (Byte.class.isAssignableFrom(type) || byte.class.isAssignableFrom(type)) { return ByteSerde.get; } else if (Date.class.isAssignableFrom(type)) { return DateSerde.get; } else if (Long.class.isAssignableFrom(type) || long.class.isAssignableFrom(type)) { return LongSerde.get; } else if (Integer.class.isAssignableFrom(type) || int.class.isAssignableFrom(type)) { return IntegerSerde.get; } else if (Calendar.class.isAssignableFrom(type)) { return CalendarSerde.get; } else if (String.class.isAssignableFrom(type)) { return StringSerde.get; } else if (Void.class.isAssignableFrom(type) || void.class.isAssignableFrom(type)) { return VoidSerde.get; } else { // fallback to slower serialization // do not check type to gracefully fall back on interface types like List return SerializingSerde.get(); } } @Override public O fromBytes(final byte[] bytes) { return delegate.fromBytes(bytes); } @Override public byte[] toBytes(final O obj) { return delegate.toBytes(obj); } }