Issue 50: The XML serializer will fail to deserialize a message with empty child message

pull/288/head
csharptest 13 years ago committed by rogerk
parent cf6987988a
commit 6c4a2de7df
  1. 5
      src/ProtocolBuffers.Serialization/XmlFormatReader.cs
  2. 34
      src/ProtocolBuffers.Test/Compatibility/CompatibilityTests.cs

@ -225,16 +225,19 @@ namespace Google.ProtocolBuffers.Serialization
stopNode = _elements.Peek(); stopNode = _elements.Peek();
} }
if (!stopNode.IsEmpty)
{
while (!_input.IsStartElement() && _input.Depth > stopNode.Depth && _input.Read()) while (!_input.IsStartElement() && _input.Depth > stopNode.Depth && _input.Read())
{ {
continue; continue;
} }
if (_input.IsStartElement()) if (_input.IsStartElement() && _input.Depth > stopNode.Depth)
{ {
field = _input.LocalName; field = _input.LocalName;
return true; return true;
} }
}
field = null; field = null;
return false; return false;
} }

@ -25,6 +25,40 @@ namespace Google.ProtocolBuffers.Compatibility
Assert.AreEqual<object>(lhs, rhs); Assert.AreEqual<object>(lhs, rhs);
} }
[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] [TestMethod]
public virtual void RoundTripMessage1OptimizeSize() public virtual void RoundTripMessage1OptimizeSize()
{ {

Loading…
Cancel
Save