Use Message instead of GeneratedMessage which is specific to protobuf v2. Message is a common superclass of both GeneratedMessage and GeneratedMessageV3. Also throw an exception to notify caller that DynamicMessage is not supprorted. (#1191)

This commit is contained in:
Ori Schwartz 2017-11-27 21:13:39 -05:00 committed by inder123
parent 855f0493d0
commit 6e2fcdcaf2

View File

@ -34,8 +34,8 @@ import com.google.protobuf.Descriptors.Descriptor;
import com.google.protobuf.Descriptors.EnumDescriptor;
import com.google.protobuf.Descriptors.EnumValueDescriptor;
import com.google.protobuf.Descriptors.FieldDescriptor;
import com.google.protobuf.DynamicMessage;
import com.google.protobuf.Extension;
import com.google.protobuf.GeneratedMessage;
import com.google.protobuf.Message;
import java.lang.reflect.Field;
@ -72,7 +72,7 @@ import java.util.concurrent.ConcurrentMap;
* @author Stanley Wang
*/
public class ProtoTypeAdapter
implements JsonSerializer<GeneratedMessage>, JsonDeserializer<GeneratedMessage> {
implements JsonSerializer<Message>, JsonDeserializer<Message> {
/**
* Determines how enum <u>values</u> should be serialized.
*/
@ -214,7 +214,7 @@ public class ProtoTypeAdapter
}
@Override
public JsonElement serialize(GeneratedMessage src, Type typeOfSrc,
public JsonElement serialize(Message src, Type typeOfSrc,
JsonSerializationContext context) {
JsonObject ret = new JsonObject();
final Map<FieldDescriptor, Object> fields = src.getAllFields();
@ -247,17 +247,21 @@ public class ProtoTypeAdapter
}
@Override
public GeneratedMessage deserialize(JsonElement json, Type typeOfT,
public Message deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
try {
JsonObject jsonObject = json.getAsJsonObject();
@SuppressWarnings("unchecked")
Class<? extends GeneratedMessage> protoClass = (Class<? extends GeneratedMessage>) typeOfT;
Class<? extends Message> protoClass = (Class<? extends Message>) typeOfT;
if (DynamicMessage.class.isAssignableFrom(protoClass)) {
throw new IllegalStateException("only generated messages are supported");
}
try {
// Invoke the ProtoClass.newBuilder() method
GeneratedMessage.Builder<?> protoBuilder =
(GeneratedMessage.Builder<?>) getCachedMethod(protoClass, "newBuilder").invoke(null);
Message.Builder protoBuilder =
(Message.Builder) getCachedMethod(protoClass, "newBuilder").invoke(null);
Descriptor protoDescriptor =
(Descriptor) getCachedMethod(protoClass, "getDescriptor").invoke(null);
@ -303,7 +307,7 @@ public class ProtoTypeAdapter
}
}
}
return (GeneratedMessage) protoBuilder.build();
return (Message) protoBuilder.build();
} catch (SecurityException e) {
throw new JsonParseException(e);
} catch (NoSuchMethodException e) {