mirror of
https://github.com/elastic/logstash.git
synced 2025-04-24 06:37:19 -04:00
revert to Jackson BigInteger and BigDecimal serialization
This commit is contained in:
parent
3845b03def
commit
ae1df4eda6
2 changed files with 26 additions and 55 deletions
|
@ -15,6 +15,7 @@ import com.fasterxml.jackson.dataformat.cbor.CBORFactory;
|
|||
import com.fasterxml.jackson.dataformat.cbor.CBORGenerator;
|
||||
import java.io.IOException;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
import java.util.HashMap;
|
||||
import org.jruby.RubyBignum;
|
||||
import org.jruby.RubyBoolean;
|
||||
|
@ -41,8 +42,6 @@ public final class ObjectMappers {
|
|||
|
||||
private static final SimpleModule CBOR_DESERIALIZERS =
|
||||
new SimpleModule("CborRubyDeserializers")
|
||||
.addDeserializer(RubyBigDecimal.class, new RubyBigDecimalDeserializer())
|
||||
.addDeserializer(RubyBignum.class, new RubyBignumDeserializer())
|
||||
.addDeserializer(RubyNil.class, new RubyNilDeserializer());
|
||||
|
||||
public static final ObjectMapper JSON_MAPPER =
|
||||
|
@ -195,79 +194,35 @@ public final class ObjectMappers {
|
|||
|
||||
/**
|
||||
* Serializer for {@link RubyBignum} since Jackson can't handle that type natively, so we
|
||||
* simply serialize it as if it were a {@code String} and wrap it in type arguments, so that
|
||||
* deserialization happens via {@link ObjectMappers.RubyBignumDeserializer}.
|
||||
* simply serialize it as if it were a {@link BigInteger}.
|
||||
*/
|
||||
private static final class RubyBignumSerializer extends StdSerializer<RubyBignum> {
|
||||
private static final class RubyBignumSerializer extends NonTypedScalarSerializerBase<RubyBignum> {
|
||||
|
||||
RubyBignumSerializer() {
|
||||
super(RubyBignum.class);
|
||||
super(RubyBignum.class, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serialize(final RubyBignum value, final JsonGenerator jgen,
|
||||
final SerializerProvider provider) throws IOException {
|
||||
jgen.writeString(value.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serializeWithType(final RubyBignum value, final JsonGenerator jgen,
|
||||
final SerializerProvider serializers, final TypeSerializer typeSer) throws IOException {
|
||||
typeSer.writeTypePrefixForScalar(value, jgen, RubyBignum.class);
|
||||
jgen.writeString(value.toString());
|
||||
typeSer.writeTypeSuffixForScalar(value, jgen);
|
||||
}
|
||||
}
|
||||
|
||||
private static final class RubyBignumDeserializer extends StdDeserializer<RubyBignum> {
|
||||
|
||||
RubyBignumDeserializer() {
|
||||
super(RubyBignum.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RubyBignum deserialize(final JsonParser p, final DeserializationContext ctxt)
|
||||
throws IOException {
|
||||
return RubyBignum.newBignum(RubyUtil.RUBY, p.getText());
|
||||
jgen.writeNumber(value.getBigIntegerValue());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Serializer for {@link RubyBigDecimal} since Jackson can't handle that type natively, so we
|
||||
* simply serialize it as if it were a {@code String} and wrap it in type arguments, so that
|
||||
* deserialization happens via {@link ObjectMappers.RubyBigDecimalDeserializer}.
|
||||
* Serializer for {@link BigDecimal} since Jackson can't handle that type natively, so we
|
||||
* simply serialize it as if it were a {@link BigDecimal}.
|
||||
*/
|
||||
private static final class RubyBigDecimalSerializer extends StdSerializer<RubyBigDecimal> {
|
||||
private static final class RubyBigDecimalSerializer extends NonTypedScalarSerializerBase<RubyBigDecimal> {
|
||||
|
||||
RubyBigDecimalSerializer() {
|
||||
super(RubyBigDecimal.class);
|
||||
super(RubyBigDecimal.class, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serialize(final RubyBigDecimal value, final JsonGenerator jgen,
|
||||
final SerializerProvider provider) throws IOException {
|
||||
jgen.writeString(value.getBigDecimalValue().toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serializeWithType(final RubyBigDecimal value, final JsonGenerator jgen,
|
||||
final SerializerProvider serializers, final TypeSerializer typeSer) throws IOException {
|
||||
typeSer.writeTypePrefixForScalar(value, jgen, RubyBigDecimal.class);
|
||||
jgen.writeString(value.getBigDecimalValue().toString());
|
||||
typeSer.writeTypeSuffixForScalar(value, jgen);
|
||||
}
|
||||
}
|
||||
|
||||
private static final class RubyBigDecimalDeserializer extends StdDeserializer<RubyBigDecimal> {
|
||||
|
||||
RubyBigDecimalDeserializer() {
|
||||
super(RubyBigDecimal.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RubyBigDecimal deserialize(final JsonParser p, final DeserializationContext ctxt)
|
||||
throws IOException {
|
||||
return new RubyBigDecimal(RubyUtil.RUBY, new BigDecimal(p.getText()));
|
||||
jgen.writeNumber(value.getBigDecimalValue());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -84,6 +84,22 @@ public final class EventTest {
|
|||
assertEquals(e.getTimestamp().toString(), er.getTimestamp().toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for proper BigInteger and BigDecimal serialization
|
||||
* related to Jackson/CBOR issue https://github.com/elastic/logstash/issues/8379
|
||||
*/
|
||||
@Test
|
||||
public void bigNumsBinaryRoundtrip() throws Exception {
|
||||
final Event e = new Event();
|
||||
final BigInteger bi = new BigInteger("9223372036854776000");
|
||||
final BigDecimal bd = new BigDecimal("9223372036854776001.99");
|
||||
e.setField("bi", bi);
|
||||
e.setField("bd", bd);
|
||||
final Event deserialized = Event.deserialize(e.serialize());
|
||||
assertEquals(bi, deserialized.getField("bi"));
|
||||
assertEquals(bd, deserialized.getField("bd"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBareToJson() throws Exception {
|
||||
Event e = new Event();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue