From c744ccd51cdea2e92b3e06abc44336943281cddd Mon Sep 17 00:00:00 2001 From: Ori Schwartz Date: Wed, 27 Dec 2017 22:14:16 -0500 Subject: [PATCH] avoid repeated calls to build() during deserialization by obtaining field types from the Message's defaultInstance (#1215) --- .../java/com/google/gson/protobuf/ProtoTypeAdapter.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/proto/src/main/java/com/google/gson/protobuf/ProtoTypeAdapter.java b/proto/src/main/java/com/google/gson/protobuf/ProtoTypeAdapter.java index 71c95eab..c378685c 100644 --- a/proto/src/main/java/com/google/gson/protobuf/ProtoTypeAdapter.java +++ b/proto/src/main/java/com/google/gson/protobuf/ProtoTypeAdapter.java @@ -263,6 +263,9 @@ public class ProtoTypeAdapter Message.Builder protoBuilder = (Message.Builder) getCachedMethod(protoClass, "newBuilder").invoke(null); + Message defaultInstance = + (Message) getCachedMethod(protoClass, "getDefaultInstance").invoke(null); + Descriptor protoDescriptor = (Descriptor) getCachedMethod(protoClass, "getDescriptor").invoke(null); // Call setters on all of the available fields @@ -300,8 +303,7 @@ public class ProtoTypeAdapter fieldValue = context.deserialize(jsonElement, protoArrayFieldType); protoBuilder.setField(fieldDescriptor, fieldValue); } else { - Message prototype = protoBuilder.build(); - Object field = prototype.getField(fieldDescriptor); + Object field = defaultInstance.getField(fieldDescriptor); fieldValue = context.deserialize(jsonElement, field.getClass()); protoBuilder.setField(fieldDescriptor, fieldValue); }