java-commons/commons-serialize-databind-api/src/main/java/io/gitlab/jfronny/commons/serialize/databind/api/TypeAdapter.java

39 lines
1.6 KiB
Java

package io.gitlab.jfronny.commons.serialize.databind.api;
import io.gitlab.jfronny.commons.serialize.MalformedDataException;
import io.gitlab.jfronny.commons.serialize.SerializeReader;
import io.gitlab.jfronny.commons.serialize.SerializeWriter;
/**
* A type adapter for serializing and deserializing objects of a specific type.
*
* @param <T> The type of the object to serialize/deserialize
*/
public abstract class TypeAdapter<T> {
public abstract <TEx extends Throwable, Writer extends SerializeWriter<TEx, Writer>> void serialize(T value, Writer writer) throws TEx, MalformedDataException;
public abstract <TEx extends Throwable, Reader extends SerializeReader<TEx, Reader>> T deserialize(Reader reader) throws TEx, MalformedDataException;
public final TypeAdapter<T> nullSafe() {
return new TypeAdapter<>() {
@Override
public <TEx extends Throwable, Writer extends SerializeWriter<TEx, Writer>> void serialize(T value, Writer writer) throws TEx, MalformedDataException {
if (value == null) {
writer.nullValue();
} else {
TypeAdapter.this.serialize(value, writer);
}
}
@Override
public <TEx extends Throwable, Reader extends SerializeReader<TEx, Reader>> T deserialize(Reader reader) throws TEx, MalformedDataException {
if (reader.peek() == null) {
reader.nextNull();
return null;
} else {
return TypeAdapter.this.deserialize(reader);
}
}
};
}
}