aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Yang <TeBoring@users.noreply.github.com>2017-05-29 22:04:20 -0700
committerBo Yang <teboring@google.com>2017-06-20 15:06:40 -0700
commitc344fe8caa6da817d3f0ece0babf1d1acbf2bbbf (patch)
tree508ba4a5484aab9ae5a9328d75ad53096ad7948b
parentdba8928ff53ae372bba3d928a6145754a97238d5 (diff)
downloadprotobuf-c344fe8caa6da817d3f0ece0babf1d1acbf2bbbf.tar.gz
protobuf-c344fe8caa6da817d3f0ece0babf1d1acbf2bbbf.tar.bz2
protobuf-c344fe8caa6da817d3f0ece0babf1d1acbf2bbbf.zip
Oneof field should be serialized even it's equal to default. (#3153)
-rw-r--r--php/ext/google/protobuf/encode_decode.c4
-rw-r--r--php/src/Google/Protobuf/Internal/Message.php7
-rw-r--r--php/tests/encode_decode_test.php7
3 files changed, 17 insertions, 1 deletions
diff --git a/php/ext/google/protobuf/encode_decode.c b/php/ext/google/protobuf/encode_decode.c
index 28bf18f4..6e3c606b 100644
--- a/php/ext/google/protobuf/encode_decode.c
+++ b/php/ext/google/protobuf/encode_decode.c
@@ -1167,6 +1167,7 @@ static void putrawmsg(MessageHeader* msg, const Descriptor* desc,
upb_msg_field_next(&i)) {
upb_fielddef* f = upb_msg_iter_field(&i);
uint32_t offset = desc->layout->fields[upb_fielddef_index(f)].offset;
+ bool containing_oneof = false;
if (upb_fielddef_containingoneof(f)) {
uint32_t oneof_case_offset =
@@ -1179,6 +1180,7 @@ static void putrawmsg(MessageHeader* msg, const Descriptor* desc,
}
// Otherwise, fall through to the appropriate singular-field handler
// below.
+ containing_oneof = true;
}
if (is_map_field(f)) {
@@ -1209,7 +1211,7 @@ static void putrawmsg(MessageHeader* msg, const Descriptor* desc,
#define T(upbtypeconst, upbtype, ctype, default_value) \
case upbtypeconst: { \
ctype value = DEREF(message_data(msg), offset, ctype); \
- if (value != default_value) { \
+ if (containing_oneof || value != default_value) { \
upb_sink_put##upbtype(sink, sel, value); \
} \
} break;
diff --git a/php/src/Google/Protobuf/Internal/Message.php b/php/src/Google/Protobuf/Internal/Message.php
index cd15e0f0..10c639ac 100644
--- a/php/src/Google/Protobuf/Internal/Message.php
+++ b/php/src/Google/Protobuf/Internal/Message.php
@@ -739,6 +739,13 @@ class Message
*/
private function existField($field)
{
+ $oneof_index = $field->getOneofIndex();
+ if ($oneof_index !== -1) {
+ $oneof = $this->desc->getOneofDecl()[$oneof_index];
+ $oneof_name = $oneof->getName();
+ return $this->$oneof_name->getNumber() === $field->getNumber();
+ }
+
$getter = $field->getGetter();
$value = $this->$getter();
return $value !== $this->defaultValue($field);
diff --git a/php/tests/encode_decode_test.php b/php/tests/encode_decode_test.php
index 288df569..b4cfed42 100644
--- a/php/tests/encode_decode_test.php
+++ b/php/tests/encode_decode_test.php
@@ -88,6 +88,13 @@ class EncodeDecodeTest extends TestBase
$n = new TestMessage();
$n->mergeFromString($data);
$this->assertSame(1, $n->getOneofMessage()->getA());
+
+ // Encode default value
+ $m->setOneofEnum(TestEnum::ZERO);
+ $data = $m->serializeToString();
+ $n = new TestMessage();
+ $n->mergeFromString($data);
+ $this->assertSame("oneof_enum", $n->getMyOneof());
}
public function testPackedEncode()