Index: third_party/protobuf/java/core/src/main/java/com/google/protobuf/DynamicMessage.java |
diff --git a/third_party/protobuf/java/core/src/main/java/com/google/protobuf/DynamicMessage.java b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/DynamicMessage.java |
index 859a9e8fc512e55c138c5a2939bd5edd40bd9743..e6358c3bae341d286ac29376e4bd42fb03d53ab0 100644 |
--- a/third_party/protobuf/java/core/src/main/java/com/google/protobuf/DynamicMessage.java |
+++ b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/DynamicMessage.java |
@@ -297,7 +297,7 @@ public final class DynamicMessage extends AbstractMessage { |
} catch (InvalidProtocolBufferException e) { |
throw e.setUnfinishedMessage(builder.buildPartial()); |
} catch (IOException e) { |
- throw new InvalidProtocolBufferException(e.getMessage()) |
+ throw new InvalidProtocolBufferException(e) |
.setUnfinishedMessage(builder.buildPartial()); |
} |
return builder.buildPartial(); |
@@ -526,6 +526,14 @@ public final class DynamicMessage extends AbstractMessage { |
fields.clearField(oldField); |
} |
oneofCases[index] = field; |
+ } else if (field.getFile().getSyntax() == Descriptors.FileDescriptor.Syntax.PROTO3) { |
+ if (!field.isRepeated() |
+ && field.getJavaType() != FieldDescriptor.JavaType.MESSAGE |
+ && value.equals(field.getDefaultValue())) { |
+ // In proto3, setting a field to its default value is equivalent to clearing the field. |
+ fields.clearField(field); |
+ return this; |
+ } |
} |
fields.setField(field, value); |
return this; |