JDKMiscSerializers.java
package tools.jackson.databind.ser.jdk;
import java.io.ByteArrayOutputStream;
import java.util.*;
import java.util.concurrent.atomic.*;
import tools.jackson.core.*;
import tools.jackson.databind.*;
import tools.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
import tools.jackson.databind.ser.BasicSerializerFactory;
import tools.jackson.databind.ser.jackson.TokenBufferSerializer;
import tools.jackson.databind.ser.std.NullSerializer;
import tools.jackson.databind.ser.std.StdScalarSerializer;
import tools.jackson.databind.ser.std.ToStringSerializer;
import tools.jackson.databind.util.TokenBuffer;
/**
* Class that providers access to serializers user for non-structured JDK types that
* are serializer as scalars; some using basic {@link ToStringSerializer},
* others explicit serializers.
*/
public class JDKMiscSerializers
{
/**
* Method called by {@link BasicSerializerFactory} to find one of serializers provided here.
*/
public static final ValueSerializer<?> find(Class<?> raw)
{
if (raw == UUID.class) {
return new UUIDSerializer();
}
if (raw == AtomicBoolean.class) {
return new AtomicBooleanSerializer();
}
if (raw == AtomicInteger.class) {
return new AtomicIntegerSerializer();
}
if (raw == AtomicLong.class) {
return new AtomicLongSerializer();
}
// Jackson-specific type(s)
// (Q: can this ever be sub-classed?)
if (raw == TokenBuffer.class) {
return new TokenBufferSerializer();
}
// And then some stranger types... not 100% they are needed but:
if ((raw == Void.class) || (raw == Void.TYPE)) {
return NullSerializer.instance;
}
if (ByteArrayOutputStream.class.isAssignableFrom(raw)) {
return new ByteArrayOutputStreamSerializer();
}
return null;
}
/*
/**********************************************************************
/* Serializers for atomic types
/**********************************************************************
*/
public static class AtomicBooleanSerializer
extends StdScalarSerializer<AtomicBoolean>
{
public AtomicBooleanSerializer() { super(AtomicBoolean.class, false); }
@Override
public void serialize(AtomicBoolean value, JsonGenerator gen, SerializationContext provider) throws JacksonException {
gen.writeBoolean(value.get());
}
@Override
public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) {
visitor.expectBooleanFormat(typeHint);
}
}
public static class AtomicIntegerSerializer
extends StdScalarSerializer<AtomicInteger>
{
public AtomicIntegerSerializer() { super(AtomicInteger.class, false); }
@Override
public void serialize(AtomicInteger value, JsonGenerator gen, SerializationContext provider) throws JacksonException {
gen.writeNumber(value.get());
}
@Override
public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint)
{
visitIntFormat(visitor, typeHint, JsonParser.NumberType.INT);
}
}
public static class AtomicLongSerializer
extends StdScalarSerializer<AtomicLong>
{
public AtomicLongSerializer() { super(AtomicLong.class, false); }
@Override
public void serialize(AtomicLong value, JsonGenerator gen, SerializationContext provider) throws JacksonException {
gen.writeNumber(value.get());
}
@Override
public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint)
{
visitIntFormat(visitor, typeHint, JsonParser.NumberType.LONG);
}
}
/*
/**********************************************************************
/* Serializers, other
/**********************************************************************
*/
/**
* @since 3.0
*/
public static class ByteArrayOutputStreamSerializer
extends StdScalarSerializer<ByteArrayOutputStream>
{
public ByteArrayOutputStreamSerializer() { super(ByteArrayOutputStream.class, false); }
@Override
public void serialize(ByteArrayOutputStream value, JsonGenerator gen,
SerializationContext ctxt) throws JacksonException {
gen.writeBinary(value.toByteArray());
}
@Override
public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint)
{
acceptJsonFormatVisitorForBinary(visitor, typeHint);
}
}
}