aboutsummaryrefslogtreecommitdiff
path: root/java/core/src/main/java/com
diff options
context:
space:
mode:
authorJonathan Haber <jhaber@hubspot.com>2018-07-23 16:45:22 -0400
committerFeng Xiao <xfxyjwf@gmail.com>2018-07-23 13:45:22 -0700
commit964201af37f8a0009440a52a30a66317724a52c3 (patch)
treecdd3085840a8d5548411a7a9c4c6cddf2a997c5e /java/core/src/main/java/com
parentbc2364c6135226591acb24bd078000aaf940862a (diff)
downloadprotobuf-964201af37f8a0009440a52a30a66317724a52c3.tar.gz
protobuf-964201af37f8a0009440a52a30a66317724a52c3.tar.bz2
protobuf-964201af37f8a0009440a52a30a66317724a52c3.zip
Store the class object itself (#4927)
* Store the class object itself * Add test for backwards compatibility * Rename and add test * Add comments
Diffstat (limited to 'java/core/src/main/java/com')
-rw-r--r--java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java16
1 files changed, 12 insertions, 4 deletions
diff --git a/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java b/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java
index df01547e..1e122d16 100644
--- a/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java
+++ b/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java
@@ -1407,7 +1407,7 @@ public abstract class GeneratedMessageLite<
/**
* A serialized (serializable) form of the generated message. Stores the
- * message as a class name and a byte array.
+ * message as a class and a byte array.
*/
protected static final class SerializedForm implements Serializable {
@@ -1417,6 +1417,9 @@ public abstract class GeneratedMessageLite<
private static final long serialVersionUID = 0L;
+ // since v3.6.1
+ private final Class<?> messageClass;
+ // only included for backwards compatibility before messageClass was added
private final String messageClassName;
private final byte[] asBytes;
@@ -1425,7 +1428,8 @@ public abstract class GeneratedMessageLite<
* @param regularForm the message to serialize
*/
SerializedForm(MessageLite regularForm) {
- messageClassName = regularForm.getClass().getName();
+ messageClass = regularForm.getClass();
+ messageClassName = messageClass.getName();
asBytes = regularForm.toByteArray();
}
@@ -1437,7 +1441,7 @@ public abstract class GeneratedMessageLite<
@SuppressWarnings("unchecked")
protected Object readResolve() throws ObjectStreamException {
try {
- Class<?> messageClass = Class.forName(messageClassName);
+ Class<?> messageClass = resolveMessageClass();
java.lang.reflect.Field defaultInstanceField =
messageClass.getDeclaredField("DEFAULT_INSTANCE");
defaultInstanceField.setAccessible(true);
@@ -1464,7 +1468,7 @@ public abstract class GeneratedMessageLite<
@Deprecated
private Object readResolveFallback() throws ObjectStreamException {
try {
- Class<?> messageClass = Class.forName(messageClassName);
+ Class<?> messageClass = resolveMessageClass();
java.lang.reflect.Field defaultInstanceField =
messageClass.getDeclaredField("defaultInstance");
defaultInstanceField.setAccessible(true);
@@ -1484,6 +1488,10 @@ public abstract class GeneratedMessageLite<
throw new RuntimeException("Unable to understand proto buffer", e);
}
}
+
+ private Class<?> resolveMessageClass() throws ClassNotFoundException {
+ return messageClass != null ? messageClass : Class.forName(messageClassName);
+ }
}
/**