Skip to content

Commit

Permalink
XmlSerializer in .NET 6 Omits Line Breaks by Default (#1760)
Browse files Browse the repository at this point in the history
* fix xml output in .NET 6
* unify the way xml writer settings are generated and used, add validation tests
  • Loading branch information
mregen committed Mar 31, 2022
1 parent cc09a56 commit eda38cb
Show file tree
Hide file tree
Showing 14 changed files with 68 additions and 67 deletions.
15 changes: 4 additions & 11 deletions Libraries/Opc.Ua.Client/Session.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1295,11 +1295,8 @@ public void Save(string filePath)
public void Save(Stream stream, IEnumerable<Subscription> subscriptions)
{
SubscriptionCollection subscriptionList = new SubscriptionCollection(subscriptions);
XmlWriterSettings settings = new XmlWriterSettings {
Indent = true,
OmitXmlDeclaration = false,
Encoding = Encoding.UTF8
};
XmlWriterSettings settings = Utils.DefaultXmlWriterSettings();

using (XmlWriter writer = XmlWriter.Create(stream, settings))
{
DataContractSerializer serializer = new DataContractSerializer(typeof(SubscriptionCollection));
Expand All @@ -1326,12 +1323,8 @@ public void Save(string filePath, IEnumerable<Subscription> subscriptions)
public IEnumerable<Subscription> Load(Stream stream)
{
// secure settings
XmlReaderSettings settings = new XmlReaderSettings {
DtdProcessing = DtdProcessing.Prohibit,
XmlResolver = null,
ConformanceLevel = ConformanceLevel.Document,
CloseInput = true
};
XmlReaderSettings settings = Utils.DefaultXmlReaderSettings();
settings.CloseInput = true;

using (XmlReader reader = XmlReader.Create(stream, settings))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,7 @@ public static void SaveConfiguration(PubSubConfigurationDataType pubSubConfigura
{
Stream ostrm = File.Open(filePath, FileMode.Create, FileAccess.ReadWrite);

XmlWriterSettings settings = new XmlWriterSettings();

settings.Encoding = System.Text.Encoding.UTF8;
settings.Indent = true;
XmlWriterSettings settings = Utils.DefaultXmlWriterSettings();
settings.CloseOutput = true;

using (XmlWriter writer = XmlDictionaryWriter.Create(ostrm, settings))
Expand Down
7 changes: 5 additions & 2 deletions Stack/Opc.Ua.Core/Schema/UANodeSetHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,15 @@ public static UANodeSet Read(Stream istrm)
/// <param name="istrm">The input stream.</param>
public void Write(Stream istrm)
{
StreamWriter writer = new StreamWriter(istrm, Encoding.UTF8);
var setting = Utils.DefaultXmlWriterSettings();
setting.CloseOutput = true;

var writer = XmlWriter.Create(istrm, setting);

try
{
XmlSerializer serializer = new XmlSerializer(typeof(UANodeSet));
serializer.Serialize(writer, this);
serializer.Serialize(writer, this, null);
}
finally
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -407,12 +407,8 @@ public static string GetFilePathFromAppConfig(string sectionName)
/// <remarks>Calls GetType() on the current instance and passes that to the DataContractSerializer.</remarks>
public void SaveToFile(string filePath)
{
XmlWriterSettings settings = new XmlWriterSettings()
{
Encoding = Encoding.UTF8,
Indent = true,
CloseOutput = true
};
XmlWriterSettings settings = Utils.DefaultXmlWriterSettings();
settings.CloseOutput = true;

using (Stream ostrm = File.Open(filePath, FileMode.Create, FileAccess.ReadWrite))
using (XmlWriter writer = XmlDictionaryWriter.Create(ostrm, settings))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ public static ConfiguredEndpointCollection Load(Stream istrm)
}
catch (Exception e)
{
Utils.LogError(e, "Unexpected error loading ConfiguredEnpoints.");
Utils.LogError(e, "Unexpected error loading ConfiguredEndpoints.");
throw;
}
}
Expand Down
5 changes: 1 addition & 4 deletions Stack/Opc.Ua.Core/Stack/Nodes/NodeSet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,7 @@ public static NodeSet Read(Stream istrm)
/// <param name="istrm">The input stream.</param>
public void Write(Stream istrm)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
settings.Indent = true;
XmlWriter writer = XmlWriter.Create(istrm, settings);
var writer = XmlWriter.Create(istrm, Utils.DefaultXmlWriterSettings());

try
{
Expand Down
17 changes: 6 additions & 11 deletions Stack/Opc.Ua.Core/Stack/State/NodeState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -528,19 +528,14 @@ protected virtual void Export(ISystemContext context, Node node)
/// <param name="ostrm">The stream to write.</param>
public void SaveAsXml(ISystemContext context, Stream ostrm)
{
ServiceMessageContext messageContext = new ServiceMessageContext();
ServiceMessageContext messageContext = new ServiceMessageContext {
NamespaceUris = context.NamespaceUris,
ServerUris = context.ServerUris,
Factory = context.EncodeableFactory
};

messageContext.NamespaceUris = context.NamespaceUris;
messageContext.ServerUris = context.ServerUris;
messageContext.Factory = context.EncodeableFactory;

XmlWriterSettings settings = new XmlWriterSettings();

settings.Encoding = Encoding.UTF8;
XmlWriterSettings settings = Utils.DefaultXmlWriterSettings();
settings.CloseOutput = true;
settings.ConformanceLevel = ConformanceLevel.Document;
settings.Indent = true;

using (XmlWriter writer = XmlWriter.Create(ostrm, settings))
{
XmlQualifiedName root = new XmlQualifiedName(this.SymbolicName, context.NamespaceUris.GetString(this.BrowseName.NamespaceIndex));
Expand Down
23 changes: 7 additions & 16 deletions Stack/Opc.Ua.Core/Stack/State/NodeStateCollection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,13 +73,8 @@ public void SaveAsNodeSet(ISystemContext context, Stream ostrm)
nodeSet.Add(node, nodeTable.NamespaceUris, nodeTable.ServerUris);
}

XmlWriterSettings settings = new XmlWriterSettings();

settings.Encoding = Encoding.UTF8;
XmlWriterSettings settings = Utils.DefaultXmlWriterSettings();
settings.CloseOutput = true;
settings.ConformanceLevel = ConformanceLevel.Document;
settings.Indent = true;

using (XmlWriter writer = XmlWriter.Create(ostrm, settings))
{
DataContractSerializer serializer = new DataContractSerializer(typeof(NodeSet));
Expand Down Expand Up @@ -200,18 +195,14 @@ public void SaveAsXml(ISystemContext context, Stream ostrm)
/// </summary>
public void SaveAsXml(ISystemContext context, Stream ostrm, bool keepStreamOpen)
{
XmlWriterSettings settings = new XmlWriterSettings();

settings.Encoding = Encoding.UTF8;
XmlWriterSettings settings = Utils.DefaultXmlWriterSettings();
settings.CloseOutput = !keepStreamOpen;
settings.ConformanceLevel = ConformanceLevel.Document;
settings.Indent = true;

ServiceMessageContext messageContext = new ServiceMessageContext();

messageContext.NamespaceUris = context.NamespaceUris;
messageContext.ServerUris = context.ServerUris;
messageContext.Factory = context.EncodeableFactory;
ServiceMessageContext messageContext = new ServiceMessageContext {
NamespaceUris = context.NamespaceUris,
ServerUris = context.ServerUris,
Factory = context.EncodeableFactory
};

using (XmlWriter writer = XmlWriter.Create(ostrm, settings))
{
Expand Down
2 changes: 1 addition & 1 deletion Stack/Opc.Ua.Core/Types/Encoders/XmlEncoder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public XmlEncoder(IServiceMessageContext context)
m_context = context;
m_nestingLevel = 0;

XmlWriterSettings settings = new XmlWriterSettings();
XmlWriterSettings settings = Utils.DefaultXmlWriterSettings();
settings.CheckCharacters = false;
settings.ConformanceLevel = ConformanceLevel.Auto;
settings.NamespaceHandling = NamespaceHandling.OmitDuplicates;
Expand Down
6 changes: 1 addition & 5 deletions Stack/Opc.Ua.Core/Types/Schemas/BinarySchemaValidator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,7 @@ public async Task Validate(string inputPath)
/// </summary>
public override string GetSchema(string typeName)
{
XmlWriterSettings settings = new XmlWriterSettings();

settings.Encoding = Encoding.UTF8;
settings.Indent = true;
settings.IndentChars = " ";
XmlWriterSettings settings = Utils.DefaultXmlWriterSettings();

MemoryStream ostrm = new MemoryStream();
XmlWriter writer = XmlWriter.Create(ostrm, settings);
Expand Down
6 changes: 1 addition & 5 deletions Stack/Opc.Ua.Core/Types/Schemas/XmlSchemaValidator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -114,11 +114,7 @@ public void Validate(Stream stream)
/// </summary>
public override string GetSchema(string typeName)
{
XmlWriterSettings settings = new XmlWriterSettings();

settings.Encoding = Encoding.UTF8;
settings.Indent = true;
settings.IndentChars = " ";
XmlWriterSettings settings = Utils.DefaultXmlWriterSettings();

MemoryStream ostrm = new MemoryStream();
XmlWriter writer = XmlWriter.Create(ostrm, settings);
Expand Down
16 changes: 15 additions & 1 deletion Stack/Opc.Ua.Core/Types/Utils/Utils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2801,7 +2801,7 @@ public static string GetAssemblyBuildNumber()
/// DtdProcessing Prohibited, XmlResolver disabled and
/// ConformanceLevel Document.
/// </summary>
internal static XmlReaderSettings DefaultXmlReaderSettings()
public static XmlReaderSettings DefaultXmlReaderSettings()
{
return new XmlReaderSettings() {
DtdProcessing = DtdProcessing.Prohibit,
Expand All @@ -2810,6 +2810,20 @@ internal static XmlReaderSettings DefaultXmlReaderSettings()
};
}

/// <summary>
/// Returns a XmlWriterSetting with deterministic defaults across .NET versions.
/// </summary>
public static XmlWriterSettings DefaultXmlWriterSettings()
{
return new XmlWriterSettings() {
Encoding = Encoding.UTF8,
Indent = true,
ConformanceLevel = ConformanceLevel.Document,
IndentChars = " ",
CloseOutput = false,
};
}

/// <summary>
/// Safe version for assignment of InnerXml.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1117,6 +1117,7 @@ public async Task TestInvalidSignature(bool ca, bool trusted)
/// Test if a key below min length is detected.
/// </summary>
[Theory]
[NonParallelizable]
public async Task TestMinimumKeyRejected(bool trusted)
{
var cert = CertificateFactory.CreateCertificate(null, null, "CN=1k Key", null)
Expand Down Expand Up @@ -1165,6 +1166,7 @@ public async Task TestMinimumKeyRejected(bool trusted)
/// Test auto accept.
/// </summary>
[Theory]
[NonParallelizable]
public async Task TestAutoAccept(bool trusted, bool autoAccept)
{
var cert = CertificateFactory.CreateCertificate(null, null, "CN=Test", null)
Expand Down
21 changes: 21 additions & 0 deletions Tests/Opc.Ua.Core.Tests/Types/Utils/UtilTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,27 @@ public void BuiltInTypeOfSimpleDataTypes()
}
}

[Test]
public void ValidateXmlWriterSettings()
{
XmlWriterSettings settings = Utils.DefaultXmlWriterSettings();
Assert.AreEqual(Encoding.UTF8, settings.Encoding);
Assert.AreEqual(false, settings.CloseOutput);
Assert.AreEqual(true, settings.Indent);
Assert.AreEqual(ConformanceLevel.Document, settings.ConformanceLevel);
Assert.AreEqual(false, settings.OmitXmlDeclaration);
Assert.AreEqual(" ", settings.IndentChars);
}

[Test]
public void ValidateXmlReaderSettings()
{
XmlReaderSettings settings = Utils.DefaultXmlReaderSettings();
Assert.AreEqual(DtdProcessing.Prohibit, settings.DtdProcessing);
//Assert.AreEqual(null, settings.XmlResolver);
Assert.AreEqual(ConformanceLevel.Document, settings.ConformanceLevel);
Assert.AreEqual(false, settings.CloseInput);
}
#endregion
}

Expand Down

0 comments on commit eda38cb

Please sign in to comment.