فهرست منبع

Fix for incorrect handling of Whitespace after an array open in XmlFormatReader

csharptest 14 سال پیش
والد
کامیت
4b75bbe45f

+ 6 - 2
src/ProtocolBuffers.Serialization/XmlFormatReader.cs

@@ -315,10 +315,14 @@ namespace Google.ProtocolBuffers.Serialization
             }
             else
             {
+                string found;
                 ReadMessageStart(field);
-                foreach (string item in NonNestedArrayItems("item"))
+                if (PeekNext(out found) && found == "item")
                 {
-                    yield return item;
+                    foreach (string item in NonNestedArrayItems("item"))
+                    {
+                        yield return item;
+                    }
                 }
                 ReadMessageEnd();
             }

+ 18 - 0
src/ProtocolBuffers.Test/Compatibility/JsonCompatibilityTests.cs

@@ -7,6 +7,24 @@ namespace Google.ProtocolBuffers.Compatibility
 {
     [TestFixture]
     public class JsonCompatibilityTests : CompatibilityTests
+    {
+        protected override object SerializeMessage<TMessage, TBuilder>(TMessage message)
+        {
+            StringWriter sw = new StringWriter();
+            JsonFormatWriter.CreateInstance(sw)
+                .WriteMessage(message);
+            return sw.ToString();
+        }
+
+        protected override TBuilder DeserializeMessage<TMessage, TBuilder>(object message, TBuilder builder, ExtensionRegistry registry)
+        {
+            JsonFormatReader.CreateInstance((string)message).Merge(builder);
+            return builder;
+        }
+    }
+
+    [TestFixture]
+    public class JsonCompatibilityFormattedTests : CompatibilityTests
     {
         protected override object SerializeMessage<TMessage, TBuilder>(TMessage message)
         {

+ 21 - 0
src/ProtocolBuffers.Test/Compatibility/XmlCompatibilityTests.cs

@@ -1,4 +1,5 @@
 using System.IO;
+using System.Xml;
 using Google.ProtocolBuffers.Serialization;
 using Google.ProtocolBuffers.TestProtos;
 using NUnit.Framework;
@@ -22,4 +23,24 @@ namespace Google.ProtocolBuffers.Compatibility
             return reader.Merge("root", builder, registry);
         }
     }
+
+    [TestFixture]
+    public class XmlCompatibilityFormattedTests : CompatibilityTests
+    {
+        protected override object SerializeMessage<TMessage, TBuilder>(TMessage message)
+        {
+            StringWriter text = new StringWriter();
+            XmlWriter xwtr = XmlWriter.Create(text, new XmlWriterSettings { Indent = true, IndentChars = "  " });
+
+            XmlFormatWriter writer = XmlFormatWriter.CreateInstance(xwtr).SetOptions(XmlWriterOptions.OutputNestedArrays);
+            writer.WriteMessage("root", message);
+            return text.ToString();
+        }
+
+        protected override TBuilder DeserializeMessage<TMessage, TBuilder>(object message, TBuilder builder, ExtensionRegistry registry)
+        {
+            XmlFormatReader reader = XmlFormatReader.CreateInstance((string)message).SetOptions(XmlReaderOptions.ReadNestedArrays);
+            return reader.Merge("root", builder, registry);
+        }
+    }
 }

+ 6 - 2
src/ProtocolBuffers.Test/TestWriterFormatXml.cs

@@ -194,7 +194,9 @@ namespace Google.ProtocolBuffers
                 .Build();
 
             StringWriter sw = new StringWriter();
-            XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
+            XmlWriter xwtr = XmlWriter.Create(sw, new XmlWriterSettings {Indent = true, IndentChars = "  "});
+
+            XmlFormatWriter.CreateInstance(xwtr).WriteMessage("root", message);
 
             string xml = sw.ToString();
 
@@ -221,7 +223,9 @@ namespace Google.ProtocolBuffers
                 .Build();
 
             StringWriter sw = new StringWriter();
-            XmlFormatWriter.CreateInstance(sw)
+            XmlWriter xwtr = XmlWriter.Create(sw, new XmlWriterSettings { Indent = true, IndentChars = "  " });
+
+            XmlFormatWriter.CreateInstance(xwtr)
                 .SetOptions(XmlWriterOptions.OutputNestedArrays | XmlWriterOptions.OutputEnumValues)
                 .WriteMessage("root", message);