Newer
Older
wicketspringdata / src / main / java / ru / simplex_software / wicket_springdata / kryo / AbstractKryoHolder.java
package ru.simplex_software.wicket_springdata.kryo;

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import org.springframework.data.domain.Persistable;
import org.springframework.data.repository.CrudRepository;

import java.io.Serializable;

/**
 * Загрузка и настройка Kryo.
 */
public abstract class AbstractKryoHolder {

    protected Kryo kryo = new Kryo();

    /**
     * Сериализация объекта.
     */
    public <P extends Persistable<? extends Serializable>> void writeObject(Output output, P entity) {
        kryo.writeObject(output, entity);
    }

    /**
     * Десериализация объекта.
     */
    public <P extends Persistable<? extends Serializable>> P readObject(Input input, Class<P> type) {
        return kryo.readObject(input, type);
    }

    /**
     * Регистрация сериалайзера для сохраняемой сущноси.
     *
     * @param entityClass класс сувщности.
     * @param repository  репозиторий сущности.
     * @param idClass     класс первичного ключа сущности.
     * @param <P>         тип сущности.
     * @param <ID>        тип первичного ключа сущности.
     */
    protected <P extends Persistable<ID>, ID extends Serializable> void registerPersistable(Class<P> entityClass,
                                                                                            CrudRepository<P, ID> repository,
                                                                                            Class<ID> idClass) {
        kryo.register(entityClass, new PersistableSerializer<>(repository::findById, idClass));
    }
}