diff --git a/src/libraries/Common/tests/System/Runtime/Serialization/DataContractSerializerHelper.cs b/src/libraries/Common/tests/System/Runtime/Serialization/DataContractSerializerHelper.cs index 164015006109b4..eeebcc9dcbb28d 100644 --- a/src/libraries/Common/tests/System/Runtime/Serialization/DataContractSerializerHelper.cs +++ b/src/libraries/Common/tests/System/Runtime/Serialization/DataContractSerializerHelper.cs @@ -4,14 +4,14 @@ using System.IO; using System.Reflection; using System.Runtime.Serialization.Formatters.Binary; - +using System.Xml; using Xunit; namespace System.Runtime.Serialization.Tests { public static class DataContractSerializerHelper { - internal static T SerializeAndDeserialize(T value, string baseline, DataContractSerializerSettings settings = null, Func serializerFactory = null, bool skipStringCompare = false) + internal static T SerializeAndDeserialize(T value, string baseline, DataContractSerializerSettings settings = null, Func serializerFactory = null, bool skipStringCompare = false, bool verifyBinaryRoundTrip = true) { DataContractSerializer dcs; if (serializerFactory != null) @@ -23,6 +23,7 @@ internal static T SerializeAndDeserialize(T value, string baseline, DataContr dcs = (settings != null) ? new DataContractSerializer(typeof(T), settings) : new DataContractSerializer(typeof(T)); } + T deserialized; using (MemoryStream ms = new MemoryStream()) { dcs.WriteObject(ms, value); @@ -38,9 +39,37 @@ internal static T SerializeAndDeserialize(T value, string baseline, DataContr } ms.Position = 0; - T deserialized = (T)dcs.ReadObject(ms); + deserialized = (T)dcs.ReadObject(ms); + } + + if (verifyBinaryRoundTrip) + { + RoundTripBinarySerialization(value, settings, serializerFactory); + } - return deserialized; + return deserialized; + } + + internal static T RoundTripBinarySerialization(T value, DataContractSerializerSettings settings = null, Func serializerFactory = null) + { + DataContractSerializer dcs; + if (serializerFactory != null) + { + dcs = serializerFactory(); + } + else + { + dcs = (settings != null) ? new DataContractSerializer(typeof(T), settings) : new DataContractSerializer(typeof(T)); + } + + using (MemoryStream ms = new MemoryStream()) + using (XmlDictionaryWriter binWriter = XmlDictionaryWriter.CreateBinaryWriter(ms)) + { + dcs.WriteObject(binWriter, value); + binWriter.Flush(); + ms.Position = 0; + XmlDictionaryReader binReader = XmlDictionaryReader.CreateBinaryReader(ms, XmlDictionaryReaderQuotas.Max); + return (T)dcs.ReadObject(binReader); } } } diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Xml/XmlBufferReader.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Xml/XmlBufferReader.cs index a4ea049ecdb607..34bf2427ee3915 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Xml/XmlBufferReader.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Xml/XmlBufferReader.cs @@ -373,10 +373,18 @@ public long ReadInt64() => BitConverter.IsLittleEndian ? ReadRawBytes() : BinaryPrimitives.ReverseEndianness(ReadRawBytes()); public float ReadSingle() - => BinaryPrimitives.ReadSingleLittleEndian(GetBuffer(sizeof(float), out int offset).AsSpan(offset, sizeof(float))); + { + float f = BinaryPrimitives.ReadSingleLittleEndian(GetBuffer(sizeof(float), out int offset).AsSpan(offset, sizeof(float))); + Advance(sizeof(float)); + return f; + } public double ReadDouble() - => BinaryPrimitives.ReadDoubleLittleEndian(GetBuffer(sizeof(double), out int offset).AsSpan(offset, sizeof(double))); + { + double d = BinaryPrimitives.ReadDoubleLittleEndian(GetBuffer(sizeof(double), out int offset).AsSpan(offset, sizeof(double))); + Advance(sizeof(double)); + return d; + } public decimal ReadDecimal() {