package com.esotericsoftware.kryo.serializers; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; import com.esotericsoftware.kryo.util.Util; import java.util.Optional; import java.util.OptionalDouble; import java.util.OptionalInt; import java.util.OptionalLong; public final class OptionalSerializers { public static class OptionalDoubleSerializer extends Serializer { private OptionalDoubleSerializer() { setImmutable(true); } @Override // com.esotericsoftware.kryo.Serializer public OptionalDouble read(Kryo kryo, Input input, Class cls) { return input.readBoolean() ? OptionalDouble.of(input.readDouble()) : OptionalDouble.empty(); } public void write(Kryo kryo, Output output, OptionalDouble optionalDouble) { output.writeBoolean(optionalDouble.isPresent()); if (optionalDouble.isPresent()) { output.writeDouble(optionalDouble.getAsDouble()); } } } public static class OptionalIntSerializer extends Serializer { private OptionalIntSerializer() { setImmutable(true); } @Override // com.esotericsoftware.kryo.Serializer public OptionalInt read(Kryo kryo, Input input, Class cls) { return input.readBoolean() ? OptionalInt.of(input.readInt()) : OptionalInt.empty(); } public void write(Kryo kryo, Output output, OptionalInt optionalInt) { output.writeBoolean(optionalInt.isPresent()); if (optionalInt.isPresent()) { output.writeInt(optionalInt.getAsInt()); } } } public static class OptionalLongSerializer extends Serializer { private OptionalLongSerializer() { setImmutable(true); } @Override // com.esotericsoftware.kryo.Serializer public OptionalLong read(Kryo kryo, Input input, Class cls) { return input.readBoolean() ? OptionalLong.of(input.readLong()) : OptionalLong.empty(); } public void write(Kryo kryo, Output output, OptionalLong optionalLong) { output.writeBoolean(optionalLong.isPresent()); if (optionalLong.isPresent()) { output.writeLong(optionalLong.getAsLong()); } } } public static class OptionalSerializer extends Serializer { private OptionalSerializer() { setAcceptsNull(false); } public Optional copy(Kryo kryo, Optional optional) { return optional.isPresent() ? Optional.of(kryo.copy(optional.get())) : optional; } @Override // com.esotericsoftware.kryo.Serializer public Optional read(Kryo kryo, Input input, Class cls) { return Optional.ofNullable(kryo.readClassAndObject(input)); } public void write(Kryo kryo, Output output, Optional optional) { kryo.writeClassAndObject(output, optional.isPresent() ? optional.get() : null); } } public static void addDefaultSerializers(Kryo kryo) { if (Util.isClassAvailable("java.util.Optional")) { kryo.addDefaultSerializer(Optional.class, new OptionalSerializer()); } if (Util.isClassAvailable("java.util.OptionalInt")) { kryo.addDefaultSerializer(OptionalInt.class, new OptionalIntSerializer()); } if (Util.isClassAvailable("java.util.OptionalLong")) { kryo.addDefaultSerializer(OptionalLong.class, new OptionalLongSerializer()); } if (Util.isClassAvailable("java.util.OptionalDouble")) { kryo.addDefaultSerializer(OptionalDouble.class, new OptionalDoubleSerializer()); } } }