From f36a9436d03267306a49907799c04d5003704fd7 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Mon, 15 Dec 2025 14:32:31 +0100 Subject: [PATCH 1/2] Ensure primitive arrays are correctly serialized --- .../java/io/sentry/JsonObjectSerializer.java | 50 +++++++++++++ .../io/sentry/JsonObjectSerializerTest.kt | 73 +++++++++++++++++++ 2 files changed, 123 insertions(+) diff --git a/sentry/src/main/java/io/sentry/JsonObjectSerializer.java b/sentry/src/main/java/io/sentry/JsonObjectSerializer.java index 629b3fc417b..5f986746be9 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 d15b1f6a4cb..3323be84cda 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 From 1a1b89b07ed28469cb577a70f7edd16cf2662277 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Mon, 15 Dec 2025 14:35:52 +0100 Subject: [PATCH 2/2] Update CHANGELOG.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 796cfbee919..8ae9e80f849 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