2021-02-02 19:40:37 +01:00
|
|
|
package it.cavallium.dbengine.database.serialization;
|
|
|
|
|
2021-04-30 19:15:04 +02:00
|
|
|
import io.netty.buffer.ByteBuf;
|
2021-05-03 21:41:51 +02:00
|
|
|
import io.netty.buffer.ByteBufAllocator;
|
2021-04-30 19:15:04 +02:00
|
|
|
import io.netty.buffer.ByteBufUtil;
|
|
|
|
import io.netty.buffer.PooledByteBufAllocator;
|
|
|
|
import java.nio.charset.StandardCharsets;
|
2021-02-02 19:40:37 +01:00
|
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
|
|
|
|
public interface Serializer<A, B> {
|
|
|
|
|
|
|
|
@NotNull A deserialize(@NotNull B serialized);
|
|
|
|
|
|
|
|
@NotNull B serialize(@NotNull A deserialized);
|
|
|
|
|
2021-04-30 19:15:04 +02:00
|
|
|
Serializer<ByteBuf, ByteBuf> NOOP_SERIALIZER = new Serializer<>() {
|
2021-03-14 03:13:19 +01:00
|
|
|
@Override
|
2021-04-30 19:15:04 +02:00
|
|
|
public @NotNull ByteBuf deserialize(@NotNull ByteBuf serialized) {
|
|
|
|
try {
|
|
|
|
return serialized.retainedSlice();
|
|
|
|
} finally {
|
|
|
|
serialized.release();
|
|
|
|
}
|
2021-03-14 03:13:19 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2021-04-30 19:15:04 +02:00
|
|
|
public @NotNull ByteBuf serialize(@NotNull ByteBuf deserialized) {
|
|
|
|
try {
|
|
|
|
return deserialized.retainedSlice();
|
|
|
|
} finally {
|
|
|
|
deserialized.release();
|
|
|
|
}
|
2021-03-14 03:13:19 +01:00
|
|
|
}
|
|
|
|
};
|
2021-02-02 19:40:37 +01:00
|
|
|
|
2021-04-30 19:15:04 +02:00
|
|
|
static Serializer<ByteBuf, ByteBuf> noop() {
|
2021-03-14 03:13:19 +01:00
|
|
|
return NOOP_SERIALIZER;
|
2021-02-02 19:40:37 +01:00
|
|
|
}
|
2021-04-30 19:15:04 +02:00
|
|
|
|
2021-05-03 21:41:51 +02:00
|
|
|
static Serializer<String, ByteBuf> utf8(ByteBufAllocator allocator) {
|
|
|
|
return new Serializer<>() {
|
|
|
|
@Override
|
|
|
|
public @NotNull String deserialize(@NotNull ByteBuf serialized) {
|
|
|
|
try {
|
2021-05-08 03:09:00 +02:00
|
|
|
var length = serialized.readInt();
|
|
|
|
var result = serialized.toString(serialized.readerIndex(), length, StandardCharsets.UTF_8);
|
|
|
|
serialized.readerIndex(serialized.readerIndex() + length);
|
2021-05-03 21:41:51 +02:00
|
|
|
return result;
|
|
|
|
} finally {
|
|
|
|
serialized.release();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public @NotNull ByteBuf serialize(@NotNull String deserialized) {
|
|
|
|
// UTF-8 uses max. 3 bytes per char, so calculate the worst case.
|
2021-05-08 03:09:00 +02:00
|
|
|
int length = ByteBufUtil.utf8Bytes(deserialized);
|
|
|
|
ByteBuf buf = allocator.buffer(Integer.BYTES + length);
|
|
|
|
buf.writeInt(length);
|
2021-05-03 21:41:51 +02:00
|
|
|
ByteBufUtil.writeUtf8(buf, deserialized);
|
|
|
|
return buf;
|
|
|
|
}
|
|
|
|
};
|
2021-04-30 19:15:04 +02:00
|
|
|
}
|
2021-02-02 19:40:37 +01:00
|
|
|
}
|