CavalliumDBEngine/src/main/java/it/cavallium/dbengine/database/serialization/Serializer.java

66 lines
1.7 KiB
Java
Raw Normal View History

2021-02-02 19:40:37 +01:00
package it.cavallium.dbengine.database.serialization;
import io.netty.buffer.ByteBuf;
2021-05-03 21:41:51 +02:00
import io.netty.buffer.ByteBufAllocator;
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);
Serializer<ByteBuf, ByteBuf> NOOP_SERIALIZER = new Serializer<>() {
2021-03-14 03:13:19 +01:00
@Override
public @NotNull ByteBuf deserialize(@NotNull ByteBuf serialized) {
try {
return serialized.retainedSlice();
} finally {
serialized.release();
}
2021-03-14 03:13:19 +01:00
}
@Override
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
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-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-02-02 19:40:37 +01:00
}