Skip to content
This repository was archived by the owner on Aug 30, 2023. It is now read-only.

Commit ac660f2

Browse files
authored
fix: contexts serializer avoids reflection and fixes desugaring issue (#478)
1 parent 712e0e5 commit ac660f2

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

sentry-android-core/src/main/java/io/sentry/android/core/AndroidSerializer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.google.gson.Gson;
55
import com.google.gson.GsonBuilder;
66
import io.sentry.android.core.adapters.ContextsDeserializerAdapter;
7+
import io.sentry.android.core.adapters.ContextsSerializerAdapter;
78
import io.sentry.android.core.adapters.DateDeserializerAdapter;
89
import io.sentry.android.core.adapters.DateSerializerAdapter;
910
import io.sentry.android.core.adapters.OrientationDeserializerAdapter;
@@ -96,6 +97,7 @@ Device.DeviceOrientation.class, new OrientationDeserializerAdapter(logger))
9697
.registerTypeAdapter(SentryLevel.class, new SentryLevelSerializerAdapter(logger))
9798
.registerTypeAdapter(SentryLevel.class, new SentryLevelDeserializerAdapter(logger))
9899
.registerTypeAdapter(Contexts.class, new ContextsDeserializerAdapter(logger))
100+
.registerTypeAdapter(Contexts.class, new ContextsSerializerAdapter(logger))
99101
.registerTypeAdapterFactory(UnknownPropertiesTypeAdapterFactory.get())
100102
.registerTypeAdapter(SentryEnvelopeHeader.class, new SentryEnvelopeHeaderAdapter())
101103
.registerTypeAdapter(SentryEnvelopeItemHeader.class, new SentryEnvelopeItemHeaderAdapter())
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package io.sentry.android.core.adapters;
2+
3+
import com.google.gson.JsonElement;
4+
import com.google.gson.JsonObject;
5+
import com.google.gson.JsonParseException;
6+
import com.google.gson.JsonSerializationContext;
7+
import com.google.gson.JsonSerializer;
8+
import io.sentry.core.ILogger;
9+
import io.sentry.core.SentryLevel;
10+
import io.sentry.core.protocol.Contexts;
11+
import java.lang.reflect.Type;
12+
import java.util.Map;
13+
import org.jetbrains.annotations.ApiStatus;
14+
import org.jetbrains.annotations.NotNull;
15+
16+
@ApiStatus.Internal
17+
public final class ContextsSerializerAdapter implements JsonSerializer<Contexts> {
18+
19+
private final @NotNull ILogger logger;
20+
21+
public ContextsSerializerAdapter(@NotNull final ILogger logger) {
22+
this.logger = logger;
23+
}
24+
25+
@Override
26+
public JsonElement serialize(Contexts src, Type typeOfSrc, JsonSerializationContext context) {
27+
if (src == null) {
28+
return null;
29+
}
30+
31+
final JsonObject object = new JsonObject();
32+
for (final Map.Entry<String, Object> entry : src.entrySet()) {
33+
try {
34+
final JsonElement element = context.serialize(entry.getValue(), Object.class);
35+
if (element != null) {
36+
object.add(entry.getKey(), element);
37+
}
38+
} catch (JsonParseException e) {
39+
logger.log(SentryLevel.ERROR, "%s context key isn't serializable.");
40+
}
41+
}
42+
return object;
43+
}
44+
}

0 commit comments

Comments
 (0)