aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcsharptest <roger@csharptest.net>2012-10-10 15:21:38 -0500
committerrogerk <devnull@localhost>2012-10-10 15:21:38 -0500
commit6c4a2de7df41d66e517568560259b2ab0746b05c (patch)
tree803fb7843af22e295996e72608aa159e0ff70ec2 /src
parentcf6987988a41ed236e7f48d01fdf19dc4f35e468 (diff)
downloadprotobuf-6c4a2de7df41d66e517568560259b2ab0746b05c.tar.gz
protobuf-6c4a2de7df41d66e517568560259b2ab0746b05c.tar.bz2
protobuf-6c4a2de7df41d66e517568560259b2ab0746b05c.zip
Issue 50: The XML serializer will fail to deserialize a message with empty child message
Diffstat (limited to 'src')
-rw-r--r--src/ProtocolBuffers.Serialization/XmlFormatReader.cs17
-rw-r--r--src/ProtocolBuffers.Test/Compatibility/CompatibilityTests.cs34
2 files changed, 44 insertions, 7 deletions
diff --git a/src/ProtocolBuffers.Serialization/XmlFormatReader.cs b/src/ProtocolBuffers.Serialization/XmlFormatReader.cs
index 4bf6423c..59d7ad4e 100644
--- a/src/ProtocolBuffers.Serialization/XmlFormatReader.cs
+++ b/src/ProtocolBuffers.Serialization/XmlFormatReader.cs
@@ -225,15 +225,18 @@ namespace Google.ProtocolBuffers.Serialization
stopNode = _elements.Peek();
}
- while (!_input.IsStartElement() && _input.Depth > stopNode.Depth && _input.Read())
+ if (!stopNode.IsEmpty)
{
- continue;
- }
+ while (!_input.IsStartElement() && _input.Depth > stopNode.Depth && _input.Read())
+ {
+ continue;
+ }
- if (_input.IsStartElement())
- {
- field = _input.LocalName;
- return true;
+ if (_input.IsStartElement() && _input.Depth > stopNode.Depth)
+ {
+ field = _input.LocalName;
+ return true;
+ }
}
field = null;
return false;
diff --git a/src/ProtocolBuffers.Test/Compatibility/CompatibilityTests.cs b/src/ProtocolBuffers.Test/Compatibility/CompatibilityTests.cs
index f47a6a52..20189617 100644
--- a/src/ProtocolBuffers.Test/Compatibility/CompatibilityTests.cs
+++ b/src/ProtocolBuffers.Test/Compatibility/CompatibilityTests.cs
@@ -26,6 +26,40 @@ namespace Google.ProtocolBuffers.Compatibility
}
[TestMethod]
+ public virtual void RoundTripWithEmptyChildMessageSize()
+ {
+ SizeMessage1 msg = SizeMessage1.CreateBuilder()
+ .SetField100(100)
+ .SetField15(SizeMessage1SubMessage.DefaultInstance)
+ .BuildPartial();
+ byte[] contents = msg.ToByteArray();
+ object content = SerializeMessage<SizeMessage1, SizeMessage1.Builder>(msg);
+
+ SizeMessage1 copy = DeserializeMessage<SizeMessage1, SizeMessage1.Builder>(content, SizeMessage1.CreateBuilder(), ExtensionRegistry.Empty).BuildPartial();
+
+ Assert.AreEqual(msg, copy);
+ AssertOutputEquals(content, SerializeMessage<SizeMessage1, SizeMessage1.Builder>(copy));
+ Assert.AreEqual(Convert.ToBase64String(contents), Convert.ToBase64String(copy.ToByteArray()));
+ }
+
+ [TestMethod]
+ public virtual void RoundTripWithEmptyChildMessageSpeed()
+ {
+ SpeedMessage1 msg = SpeedMessage1.CreateBuilder()
+ .SetField100(100)
+ .SetField15(SpeedMessage1SubMessage.DefaultInstance)
+ .BuildPartial();
+ byte[] contents = msg.ToByteArray();
+ object content = SerializeMessage<SpeedMessage1, SpeedMessage1.Builder>(msg);
+
+ SpeedMessage1 copy = DeserializeMessage<SpeedMessage1, SpeedMessage1.Builder>(content, SpeedMessage1.CreateBuilder(), ExtensionRegistry.Empty).BuildPartial();
+
+ Assert.AreEqual(msg, copy);
+ AssertOutputEquals(content, SerializeMessage<SpeedMessage1, SpeedMessage1.Builder>(copy));
+ Assert.AreEqual(Convert.ToBase64String(contents), Convert.ToBase64String(copy.ToByteArray()));
+ }
+
+ [TestMethod]
public virtual void RoundTripMessage1OptimizeSize()
{
SizeMessage1 msg = SizeMessage1.CreateBuilder().MergeFrom(TestResources.google_message1).Build();