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:
parent
855f0493d0
commit
6e2fcdcaf2
@ -34,8 +34,8 @@ import com.google.protobuf.Descriptors.Descriptor;
|
|||||||
import com.google.protobuf.Descriptors.EnumDescriptor;
|
import com.google.protobuf.Descriptors.EnumDescriptor;
|
||||||
import com.google.protobuf.Descriptors.EnumValueDescriptor;
|
import com.google.protobuf.Descriptors.EnumValueDescriptor;
|
||||||
import com.google.protobuf.Descriptors.FieldDescriptor;
|
import com.google.protobuf.Descriptors.FieldDescriptor;
|
||||||
|
import com.google.protobuf.DynamicMessage;
|
||||||
import com.google.protobuf.Extension;
|
import com.google.protobuf.Extension;
|
||||||
import com.google.protobuf.GeneratedMessage;
|
|
||||||
import com.google.protobuf.Message;
|
import com.google.protobuf.Message;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
@ -72,7 +72,7 @@ import java.util.concurrent.ConcurrentMap;
|
|||||||
* @author Stanley Wang
|
* @author Stanley Wang
|
||||||
*/
|
*/
|
||||||
public class ProtoTypeAdapter
|
public class ProtoTypeAdapter
|
||||||
implements JsonSerializer<GeneratedMessage>, JsonDeserializer<GeneratedMessage> {
|
implements JsonSerializer<Message>, JsonDeserializer<Message> {
|
||||||
/**
|
/**
|
||||||
* Determines how enum <u>values</u> should be serialized.
|
* Determines how enum <u>values</u> should be serialized.
|
||||||
*/
|
*/
|
||||||
@ -214,7 +214,7 @@ public class ProtoTypeAdapter
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JsonElement serialize(GeneratedMessage src, Type typeOfSrc,
|
public JsonElement serialize(Message src, Type typeOfSrc,
|
||||||
JsonSerializationContext context) {
|
JsonSerializationContext context) {
|
||||||
JsonObject ret = new JsonObject();
|
JsonObject ret = new JsonObject();
|
||||||
final Map<FieldDescriptor, Object> fields = src.getAllFields();
|
final Map<FieldDescriptor, Object> fields = src.getAllFields();
|
||||||
@ -247,17 +247,21 @@ public class ProtoTypeAdapter
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GeneratedMessage deserialize(JsonElement json, Type typeOfT,
|
public Message deserialize(JsonElement json, Type typeOfT,
|
||||||
JsonDeserializationContext context) throws JsonParseException {
|
JsonDeserializationContext context) throws JsonParseException {
|
||||||
try {
|
try {
|
||||||
JsonObject jsonObject = json.getAsJsonObject();
|
JsonObject jsonObject = json.getAsJsonObject();
|
||||||
@SuppressWarnings("unchecked")
|
@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 {
|
try {
|
||||||
// Invoke the ProtoClass.newBuilder() method
|
// Invoke the ProtoClass.newBuilder() method
|
||||||
GeneratedMessage.Builder<?> protoBuilder =
|
Message.Builder protoBuilder =
|
||||||
(GeneratedMessage.Builder<?>) getCachedMethod(protoClass, "newBuilder").invoke(null);
|
(Message.Builder) getCachedMethod(protoClass, "newBuilder").invoke(null);
|
||||||
|
|
||||||
Descriptor protoDescriptor =
|
Descriptor protoDescriptor =
|
||||||
(Descriptor) getCachedMethod(protoClass, "getDescriptor").invoke(null);
|
(Descriptor) getCachedMethod(protoClass, "getDescriptor").invoke(null);
|
||||||
@ -303,7 +307,7 @@ public class ProtoTypeAdapter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (GeneratedMessage) protoBuilder.build();
|
return (Message) protoBuilder.build();
|
||||||
} catch (SecurityException e) {
|
} catch (SecurityException e) {
|
||||||
throw new JsonParseException(e);
|
throw new JsonParseException(e);
|
||||||
} catch (NoSuchMethodException e) {
|
} catch (NoSuchMethodException e) {
|
||||||
|
Loading…
Reference in New Issue
Block a user