> void writeObject(Output output, P entity) { + kryo.writeObject(output, entity); + } + + /** + * Десериализация объекта. + */ + public
> P readObject(Input input, Class
type) { + return kryo.readObject(input, type); + } +} \ No newline at end of file diff --git a/src/main/java/ru/simplex_software/wicket_springdata/kryo/KryoModel.java b/src/main/java/ru/simplex_software/wicket_springdata/kryo/KryoModel.java new file mode 100644 index 0000000..c1b2136 --- /dev/null +++ b/src/main/java/ru/simplex_software/wicket_springdata/kryo/KryoModel.java @@ -0,0 +1,72 @@ +package ru.simplex_software.wicket_springdata.kryo; + +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; +import org.apache.wicket.injection.Injector; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.LoadableDetachableModel; +import org.apache.wicket.spring.injection.annot.SpringBean; +import org.springframework.data.domain.Persistable; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.Serializable; +import java.util.Iterator; +import java.util.stream.StreamSupport; + +/** + * Модель с kryo сериализацияей. + */ +public class KryoModel
> extends LoadableDetachableModel
{ + + @SpringBean + private AbstractKryoHolder kryoHolder; + + private byte[] data = new byte[0]; + private Class
clazz; + + public KryoModel(P entity) { + super(entity); + inject(); + clazz = (Class
) entity.getClass(); + } + + @Override + public void onDetach() { + Output output = new Output(new ByteArrayOutputStream()); + kryoHolder.writeObject(output, getObject()); + data = output.toBytes(); + } + + @Override + public void setObject(P entity) { + super.setObject(entity); + clazz = (Class
) entity.getClass(); + } + + /** + * Оборачивание элементов колекции в модели и получение итератора. + * + * @param iterable коллекция элементов. + * @return итератор коллекции моделей элементов. + */ + public static
> Iterator iterable) {
+ return StreamSupport.stream(iterable.spliterator(), false)
+ .map(KryoModel::new)
+ .map(km -> (IModel ) km)
+ .iterator();
+ }
+
+ @Override
+ protected P load() {
+ Input input = new Input(new ByteArrayInputStream(data));
+ return kryoHolder.readObject(input, clazz);
+ }
+
+ /**
+ * Добавление в контекст Spring.
+ */
+ private void inject() {
+ Injector.get().inject(this);
+ }
+}
diff --git a/src/main/java/ru/simplex_software/wicket_springdata/kryo/PersistableSerializer.java b/src/main/java/ru/simplex_software/wicket_springdata/kryo/PersistableSerializer.java
new file mode 100644
index 0000000..d827708
--- /dev/null
+++ b/src/main/java/ru/simplex_software/wicket_springdata/kryo/PersistableSerializer.java
@@ -0,0 +1,49 @@
+package ru.simplex_software.wicket_springdata.kryo;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.Serializer;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+import org.springframework.data.domain.Persistable;
+
+import java.io.Serializable;
+import java.util.Optional;
+import java.util.function.Function;
+
+/**
+ * Чтение и запись хранимых сущностей.
+ */
+public class PersistableSerializer , ID extends Serializable> extends Serializer {
+
+ private Function defaultSerializer = kryo.getDefaultSerializer(entity.getClass());
+ defaultSerializer.write(kryo, output, entity);
+ } else {
+ Serializer defaultSerializer = kryo.getDefaultSerializer(type);
+ return defaultSerializer.read(kryo, input, type);
+ } else {
+ Serializer