Files
SabreTools.Serialization/SabreTools.Serialization.Writers/XmlFile.cs

131 lines
4.7 KiB
C#
Raw Normal View History

2023-09-08 18:39:57 -04:00
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
2025-10-27 22:43:56 -04:00
using SabreTools.IO.Extensions;
2023-09-08 18:39:57 -04:00
2025-09-26 14:59:45 -04:00
namespace SabreTools.Serialization.Writers
2023-09-08 18:39:57 -04:00
{
/// <summary>
/// Base class for other XML serializers
/// </summary>
/// <typeparam name="T"></typeparam>
public class XmlFile<T> : BaseBinaryWriter<T>
2023-09-08 18:39:57 -04:00
{
#region IByteWriter
2024-04-04 02:42:25 -04:00
/// <inheritdoc/>
public override byte[]? SerializeArray(T? obj)
=> SerializeArray(obj, null, null, null, null);
/// <summary>
/// Serializes the defined type to a byte array
/// </summary>
/// <param name="obj">Data to serialize</param>
/// <param name="name">Optional DOCTYPE name</param>
/// <param name="pubid">Optional DOCTYPE pubid</param>
/// <param name="sysid">Optional DOCTYPE sysid</param>
/// <param name="subset">Optional DOCTYPE name</param>
/// <returns>Byte array containing serialized data on success, null otherwise</returns>
public byte[]? SerializeArray(T? obj, string? name = null, string? pubid = null, string? sysid = null, string? subset = null)
{
using var stream = Serialize(obj, name, pubid, sysid, subset);
2026-01-25 14:30:18 -05:00
if (stream is null)
2024-04-04 02:42:25 -04:00
return null;
byte[] bytes = new byte[stream.Length];
2024-11-13 02:42:14 -05:00
int read = stream.Read(bytes, 0, bytes.Length);
2024-04-04 02:42:25 -04:00
return bytes;
}
#endregion
#region IFileWriter
2024-04-03 21:27:50 -04:00
/// <inheritdoc/>
2025-09-26 10:20:48 -04:00
public override bool SerializeFile(T? obj, string? path)
2024-04-03 21:27:50 -04:00
=> Serialize(obj, path, null, null, null, null);
/// <summary>
/// Serializes the defined type to an XML file
/// </summary>
/// <param name="obj">Data to serialize</param>
/// <param name="path">Path to the file to serialize to</param>
/// <param name="name">Optional DOCTYPE name</param>
/// <param name="pubid">Optional DOCTYPE pubid</param>
/// <param name="sysid">Optional DOCTYPE sysid</param>
/// <param name="subset">Optional DOCTYPE name</param>
/// <returns>True on successful serialization, false otherwise</returns>
public bool Serialize(T? obj, string? path, string? name = null, string? pubid = null, string? sysid = null, string? subset = null)
{
if (string.IsNullOrEmpty(path))
return false;
using var stream = Serialize(obj, name, pubid, sysid, subset);
2026-01-25 14:30:18 -05:00
if (stream is null)
2024-04-03 21:27:50 -04:00
return false;
using var fs = File.Open(path, FileMode.Create, FileAccess.Write, FileShare.None);
2026-03-24 19:17:25 -04:00
stream.BlockCopy(fs);
fs.Flush();
2024-04-03 21:27:50 -04:00
return true;
}
#endregion
#region IStreamWriter
2024-04-03 21:27:50 -04:00
2024-04-04 02:42:25 -04:00
/// <inheritdoc/>
2025-09-26 10:20:48 -04:00
public override Stream? SerializeStream(T? obj)
2024-04-03 16:35:54 -04:00
=> Serialize(obj, null, null, null, null);
2023-09-08 18:39:57 -04:00
/// <summary>
/// Serializes the defined type to a stream
/// </summary>
/// <param name="obj">Data to serialize</param>
/// <param name="name">Optional DOCTYPE name</param>
/// <param name="pubid">Optional DOCTYPE pubid</param>
/// <param name="sysid">Optional DOCTYPE sysid</param>
/// <param name="subset">Optional DOCTYPE name</param>
/// <returns>Stream containing serialized data on success, null otherwise</returns>
2024-04-03 16:35:54 -04:00
public Stream? Serialize(T? obj, string? name = null, string? pubid = null, string? sysid = null, string? subset = null)
2023-09-08 18:39:57 -04:00
{
// If the object is null
2026-01-25 14:30:18 -05:00
if (obj is null)
2023-09-08 18:39:57 -04:00
return null;
// Setup the serializer and the writer
2023-09-08 18:39:57 -04:00
var serializer = new XmlSerializer(typeof(T));
2025-05-19 12:12:05 -04:00
var namespaces = new XmlSerializerNamespaces();
namespaces.Add("", "");
2023-09-08 18:39:57 -04:00
var settings = new XmlWriterSettings
{
CheckCharacters = false,
Encoding = Encoding.UTF8,
Indent = true,
IndentChars = "\t",
2025-07-24 09:19:38 -04:00
#if NET40_OR_GREATER || NETCOREAPP || NETSTANDARD2_0_OR_GREATER
2025-05-19 12:12:05 -04:00
NamespaceHandling = NamespaceHandling.OmitDuplicates,
2025-05-19 12:15:30 -04:00
#endif
2023-09-08 18:39:57 -04:00
NewLineChars = "\n",
};
var stream = new MemoryStream();
var streamWriter = new StreamWriter(stream);
var xmlWriter = XmlWriter.Create(streamWriter, settings);
// Write the doctype if provided
2023-11-21 20:59:20 -05:00
if (!string.IsNullOrEmpty(name))
2023-09-08 18:39:57 -04:00
xmlWriter.WriteDocType(name, pubid, sysid, subset);
// Perform the deserialization and return
2025-05-19 12:12:05 -04:00
serializer.Serialize(xmlWriter, obj, namespaces);
2025-10-27 22:43:56 -04:00
stream.SeekIfPossible(0, SeekOrigin.Begin);
2023-09-08 18:39:57 -04:00
return stream;
}
2024-04-03 21:27:50 -04:00
#endregion
2023-09-08 18:39:57 -04:00
}
}