diff options
author | csharptest <roger@csharptest.net> | 2012-10-10 15:21:38 -0500 |
---|---|---|
committer | rogerk <devnull@localhost> | 2012-10-10 15:21:38 -0500 |
commit | 6c4a2de7df41d66e517568560259b2ab0746b05c (patch) | |
tree | 803fb7843af22e295996e72608aa159e0ff70ec2 /src | |
parent | cf6987988a41ed236e7f48d01fdf19dc4f35e468 (diff) | |
download | protobuf-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.cs | 17 | ||||
-rw-r--r-- | src/ProtocolBuffers.Test/Compatibility/CompatibilityTests.cs | 34 |
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();
|