Ниже приведен ответ для каждого из них, напрямую предоставленного микропотоком, и я могу подтвердить, что это работает отлично. реализация обработчика для таких классов. В вашем случае обработчик пользовательского типа может выглядеть так:
import org.apache.commons.lang3.tuple.ImmutablePair;
import one.microstream.persistence.binary.internal.CustomBinaryHandler;
import one.microstream.persistence.binary.types.Binary;
import one.microstream.persistence.binary.types.BinaryField;
import one.microstream.persistence.types.PersistenceLoadHandler;
import one.microstream.reflect.XReflect;
public class ImmutablePairTypeHandler extends CustomBinaryHandler<ImmutablePair<?, ?>>
{
@SuppressWarnings({"unchecked", "rawtypes"})
private static Class<ImmutablePair<?, ?>> handledType()
{
return (Class)ImmutablePair.class; // to get ".class" to work
}
//the fields to be persisted
BinaryField<ImmutablePair<?, ?>> left = Field(Object.class, ImmutablePair::getLeft);
BinaryField<ImmutablePair<?, ?>> right = Field(Object.class, ImmutablePair::getRight);
public ImmutablePairTypeHandler()
{
super(handledType());
}
@Override
public ImmutablePair<?, ?> create(final Binary data, final PersistenceLoadHandler handler)
{
//create a empty instance, don't use nullPair() as it is a static final
return ImmutablePair.of(null, null);
}
@Override
public void initializeState(final Binary data, final ImmutablePair<?, ?> instance, final PersistenceLoadHandler handler)
{
//get the referenced Objects
final Object left = this.left.readReference(data, handler);
final Object right = this.right.readReference(data, handler);
//as the pair is immutable we can't set the pairs fields directly
final ImmutablePair<?,?> pair = ImmutablePair.of(left, right);
XReflect.copyFields(pair, instance);
}
}
Чтобы включить этот обработчик, просто зарегистрируйте его:
final EmbeddedStorageFoundation<?> foundation = EmbeddedStorage.Foundation(workdir);
foundation.registerTypeHandler(new ImmutablePairTypeHandler());
final EmbeddedStorageManager storage = foundation.start();