diff --git a/CHANGELOG.md b/CHANGELOG.md index 796cfbee91..8ae9e80f84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Fixes +- Support serialization of primitive arrays (boolean[], byte[], short[], char[], int[], long[], float[], double[]) ([#4968](https://github.com/getsentry/sentry-java/pull/4968)) - Session Replay: Improve network body parsing and truncation handling ([#4958](https://github.com/getsentry/sentry-java/pull/4958)) ### Internal diff --git a/sentry/src/main/java/io/sentry/JsonObjectSerializer.java b/sentry/src/main/java/io/sentry/JsonObjectSerializer.java index 629b3fc417..5f986746be 100644 --- a/sentry/src/main/java/io/sentry/JsonObjectSerializer.java +++ b/sentry/src/main/java/io/sentry/JsonObjectSerializer.java @@ -6,11 +6,13 @@ import java.io.IOException; import java.net.InetAddress; import java.net.URI; +import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Collection; import java.util.Currency; import java.util.Date; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TimeZone; @@ -53,6 +55,54 @@ public void serialize( ((JsonSerializable) object).serialize(writer, logger); } else if (object instanceof Collection) { serializeCollection(writer, logger, (Collection) object); + } else if (object instanceof boolean[]) { + final List bools = new ArrayList<>(((boolean[]) object).length); + for (boolean b : ((boolean[]) object)) { + bools.add(b); + } + serializeCollection(writer, logger, bools); + } else if (object instanceof byte[]) { + final List bytes = new ArrayList<>(((byte[]) object).length); + for (byte b : ((byte[]) object)) { + bytes.add(b); + } + serializeCollection(writer, logger, bytes); + } else if (object instanceof short[]) { + final List shorts = new ArrayList<>(((short[]) object).length); + for (short s : ((short[]) object)) { + shorts.add(s); + } + serializeCollection(writer, logger, shorts); + } else if (object instanceof char[]) { + final List chars = new ArrayList<>(((char[]) object).length); + for (char s : ((char[]) object)) { + chars.add(s); + } + serializeCollection(writer, logger, chars); + } else if (object instanceof int[]) { + final List ints = new ArrayList<>(((int[]) object).length); + for (int i : ((int[]) object)) { + ints.add(i); + } + serializeCollection(writer, logger, ints); + } else if (object instanceof long[]) { + final List longs = new ArrayList<>(((long[]) object).length); + for (long l : ((long[]) object)) { + longs.add(l); + } + serializeCollection(writer, logger, longs); + } else if (object instanceof float[]) { + final List floats = new ArrayList<>(((float[]) object).length); + for (float f : ((float[]) object)) { + floats.add(f); + } + serializeCollection(writer, logger, floats); + } else if (object instanceof double[]) { + final List doubles = new ArrayList<>(((double[]) object).length); + for (double d : ((double[]) object)) { + doubles.add(d); + } + serializeCollection(writer, logger, doubles); } else if (object.getClass().isArray()) { serializeCollection(writer, logger, Arrays.asList((Object[]) object)); } else if (object instanceof Map) { diff --git a/sentry/src/test/java/io/sentry/JsonObjectSerializerTest.kt b/sentry/src/test/java/io/sentry/JsonObjectSerializerTest.kt index d15b1f6a4c..3323be84cd 100644 --- a/sentry/src/test/java/io/sentry/JsonObjectSerializerTest.kt +++ b/sentry/src/test/java/io/sentry/JsonObjectSerializerTest.kt @@ -101,6 +101,79 @@ internal class JsonObjectSerializerTest { verify(fixture.writer).endArray() } + @Suppress("RemoveRedundantCallsOfConversionMethods") + @Test + fun `serializing primitive int array`() { + fixture.getSUT().serialize(fixture.writer, fixture.logger, intArrayOf(1, 2)) + verify(fixture.writer).beginArray() + verify(fixture.writer).value(1.toInt()) + verify(fixture.writer).value(2.toInt()) + verify(fixture.writer).endArray() + } + + @Test + fun `serializing primitive boolean array`() { + fixture.getSUT().serialize(fixture.writer, fixture.logger, booleanArrayOf(true, false)) + verify(fixture.writer).beginArray() + verify(fixture.writer).value(true) + verify(fixture.writer).value(false) + verify(fixture.writer).endArray() + } + + @Test + fun `serializing primitive byte array`() { + fixture.getSUT().serialize(fixture.writer, fixture.logger, byteArrayOf(1, 2)) + verify(fixture.writer).beginArray() + verify(fixture.writer).value(1.toByte()) + verify(fixture.writer).value(2.toByte()) + verify(fixture.writer).endArray() + } + + @Test + fun `serializing primitive short array`() { + fixture.getSUT().serialize(fixture.writer, fixture.logger, shortArrayOf(1, 2)) + verify(fixture.writer).beginArray() + verify(fixture.writer).value(1.toShort()) + verify(fixture.writer).value(2.toShort()) + verify(fixture.writer).endArray() + } + + @Test + fun `serializing primitive char array`() { + fixture.getSUT().serialize(fixture.writer, fixture.logger, charArrayOf('a', 'b')) + verify(fixture.writer).beginArray() + verify(fixture.writer).value("a") + verify(fixture.writer).value("b") + verify(fixture.writer).endArray() + } + + @Test + fun `serializing primitive long array`() { + fixture.getSUT().serialize(fixture.writer, fixture.logger, longArrayOf(1L, 2L)) + verify(fixture.writer).beginArray() + verify(fixture.writer).value(1L as Number) + verify(fixture.writer).value(2L as Number) + verify(fixture.writer).endArray() + } + + @Test + fun `serializing primitive float array`() { + fixture.getSUT().serialize(fixture.writer, fixture.logger, floatArrayOf(1.5f, 2.5f)) + verify(fixture.writer).beginArray() + verify(fixture.writer).value(1.5f as Number) + verify(fixture.writer).value(2.5f as Number) + verify(fixture.writer).endArray() + } + + @Test + fun `serializing primitive double array`() { + fixture.getSUT().serialize(fixture.writer, fixture.logger, doubleArrayOf(1.5, 2.5)) + verify(fixture.writer).beginArray() + verify(fixture.writer).value(1.5 as Number) + verify(fixture.writer).value(2.5 as Number) + verify(fixture.writer).endArray() + } + @Test fun `serialize map`() { fixture