diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs index 3ed294b0ac692d..d138146708e528 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/ReflectionXmlSerializationWriter.cs @@ -397,6 +397,17 @@ private void WriteElement(object? o, ElementAccessor element, bool writeAccessor { WriteQualifiedNameElement(name, ns!, element.Default, (XmlQualifiedName)o!, element.IsNullable, mapping.IsSoap, mapping); } + else if (o == null && element.IsNullable) + { + if (mapping.IsSoap) + { + WriteNullTagEncoded(element.Name, ns); + } + else + { + WriteNullTagLiteral(element.Name, ns); + } + } else { WritePrimitiveMethodRequirement suffixNullable = mapping.IsSoap ? WritePrimitiveMethodRequirement.Encoded : WritePrimitiveMethodRequirement.None; diff --git a/src/libraries/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.RuntimeOnly.cs b/src/libraries/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.RuntimeOnly.cs index 182fb0a3d717d8..f83571e7ebf3e6 100644 --- a/src/libraries/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.RuntimeOnly.cs +++ b/src/libraries/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.RuntimeOnly.cs @@ -42,6 +42,19 @@ public static void Xml_ByteArrayAsRoot() Assert.Equal(x, y); } + [Fact] + public static void Xml_ByteArrayNull() + { + Assert.Null(SerializeAndDeserialize(null, +@" +")); + byte[] x = new byte[] { 1, 2 }; + byte[] y = SerializeAndDeserialize(x, +@" +AQI="); + Assert.Equal(x, y); + } + [Fact] public static void Xml_CharAsRoot() { @@ -1279,6 +1292,19 @@ public static void XML_TypeWithByteArrayAsXmlAttribute() Assert.True(Enumerable.SequenceEqual(value.XmlAttributeForms, actual.XmlAttributeForms)); } + [Fact] + public static void XML_TypeWithNullableByteArray() + { + var value = new TypeWithNullableByteArray(); // XmlAttributeForms == null + + var actual = SerializeAndDeserialize(value, + "\r\n\r\n \r\n"); + + Assert.NotNull(actual); + Assert.Null(value.XmlAttributeForms); + Assert.Null(actual.XmlAttributeForms); + } + [Fact] public static void XML_TypeWithByteArrayArrayAsXmlAttribute() { diff --git a/src/libraries/System.Runtime.Serialization.Xml/tests/SerializationTypes.RuntimeOnly.cs b/src/libraries/System.Runtime.Serialization.Xml/tests/SerializationTypes.RuntimeOnly.cs index 2d414e8570248f..70e080bae6e06d 100644 --- a/src/libraries/System.Runtime.Serialization.Xml/tests/SerializationTypes.RuntimeOnly.cs +++ b/src/libraries/System.Runtime.Serialization.Xml/tests/SerializationTypes.RuntimeOnly.cs @@ -1987,6 +1987,13 @@ public class TypeWithByteArrayAsXmlAttribute public byte[] XmlAttributeForms; } + [XmlType(TypeName = "MyXmlType")] + public class TypeWithNullableByteArray + { + [XmlElement(DataType = "base64Binary", IsNullable = true)] + public byte[] XmlAttributeForms { get; set; } + } + [XmlType(TypeName = "MyXmlType")] public class TypeWithByteArrayArrayAsXmlAttribute {