using System.IO; using System.Text; using System.Xml; using System.Xml.Serialization; namespace SabreTools.Serialization.Streams { /// /// Base class for other XML serializers /// /// public partial class XmlFile : IStreamSerializer { /// /// Serializes the defined type to a stream /// /// Data to serialize /// Stream containing serialized data on success, null otherwise #if NET48 public Stream Serialize(T obj) #else public Stream? Serialize(T? obj) #endif => Serialize(obj, null, null, null, null); /// /// Serializes the defined type to a stream /// /// Data to serialize /// Optional DOCTYPE name /// Optional DOCTYPE pubid /// Optional DOCTYPE sysid /// Optional DOCTYPE name /// Stream containing serialized data on success, null otherwise #if NET48 public Stream Serialize(T obj, string name = null, string pubid = null, string sysid = null, string subset = null) #else public Stream? Serialize(T? obj, string? name = null, string? pubid = null, string? sysid = null, string? subset = null) #endif { // If the object is null if (obj == null) return null; // Setup the serializer and the reader var serializer = new XmlSerializer(typeof(T)); var settings = new XmlWriterSettings { CheckCharacters = false, Encoding = Encoding.UTF8, Indent = true, IndentChars = "\t", NewLineChars = "\n", }; var stream = new MemoryStream(); var streamWriter = new StreamWriter(stream); var xmlWriter = XmlWriter.Create(streamWriter, settings); // Write the doctype if provided if (!string.IsNullOrWhiteSpace(name)) xmlWriter.WriteDocType(name, pubid, sysid, subset); // Perform the deserialization and return serializer.Serialize(xmlWriter, obj); stream.Seek(0, SeekOrigin.Begin); return stream; } } }