diff --git a/SabreTools.Serialization/Deserializers/BaseBinaryDeserializer.cs b/SabreTools.Serialization/Deserializers/BaseBinaryDeserializer.cs index 2d658462..610040a5 100644 --- a/SabreTools.Serialization/Deserializers/BaseBinaryDeserializer.cs +++ b/SabreTools.Serialization/Deserializers/BaseBinaryDeserializer.cs @@ -73,6 +73,7 @@ namespace SabreTools.Serialization.Deserializers var deserializer = GetType>(); if (deserializer == null) return default; + return deserializer.Deserialize(path); } @@ -127,7 +128,7 @@ namespace SabreTools.Serialization.Deserializers return default; } - + #endregion } } \ No newline at end of file diff --git a/SabreTools.Serialization/Interfaces/IByteSerializer.cs b/SabreTools.Serialization/Interfaces/IByteSerializer.cs new file mode 100644 index 00000000..7a2c0edd --- /dev/null +++ b/SabreTools.Serialization/Interfaces/IByteSerializer.cs @@ -0,0 +1,16 @@ +namespace SabreTools.Serialization.Interfaces +{ + /// + /// Defines how to serialize to byte arrays + /// + public interface IByteSerializer + { + /// + /// Serialize a into a byte array + /// + /// Type of object to serialize from + /// Data to serialize + /// Filled object on success, null on error + byte[]? SerializeArray(T? obj); + } +} \ No newline at end of file diff --git a/SabreTools.Serialization/Serializers/ArchiveDotOrg.cs b/SabreTools.Serialization/Serializers/ArchiveDotOrg.cs index 1bb696a7..b18888b1 100644 --- a/SabreTools.Serialization/Serializers/ArchiveDotOrg.cs +++ b/SabreTools.Serialization/Serializers/ArchiveDotOrg.cs @@ -2,26 +2,6 @@ namespace SabreTools.Serialization.Serializers { public class ArchiveDotOrg : XmlFile { - #region IFileSerializer - - /// - public static bool SerializeFile(Models.ArchiveDotOrg.Files? obj, string? path) - { - var serializer = new ArchiveDotOrg(); - return serializer.Serialize(obj, path); - } - - #endregion - - #region IStreamSerializer - - /// - public static System.IO.Stream? SerializeStream(Models.ArchiveDotOrg.Files? obj) - { - var serializer = new ArchiveDotOrg(); - return serializer.Serialize(obj); - } - - #endregion + // All logic taken care of in the base class } } \ No newline at end of file diff --git a/SabreTools.Serialization/Serializers/AttractMode.cs b/SabreTools.Serialization/Serializers/AttractMode.cs index da6d237e..378d013c 100644 --- a/SabreTools.Serialization/Serializers/AttractMode.cs +++ b/SabreTools.Serialization/Serializers/AttractMode.cs @@ -3,13 +3,10 @@ using System.Linq; using System.Text; using SabreTools.IO.Writers; using SabreTools.Models.AttractMode; -using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Serializers { - public class AttractMode : - IFileSerializer, - IStreamSerializer + public class AttractMode : BaseBinarySerializer { #region Constants @@ -66,17 +63,44 @@ namespace SabreTools.Serialization.Serializers #endregion - #region IFileSerializer + #region IByteSerializer - /// - public static bool SerializeFile(MetadataFile? obj, string? path, bool longHeader = false) + /// + public static byte[]? SerializeBytes(MetadataFile? obj, bool longHeader = false) { var serializer = new AttractMode(); - return serializer.Serialize(obj, path); + return serializer.SerializeArray(obj, longHeader); } /// - public bool Serialize(MetadataFile? obj, string? path) + public override byte[]? SerializeArray(MetadataFile? obj) + => SerializeArray(obj, false); + + /// + public byte[]? SerializeArray(MetadataFile? obj, bool longHeader) + { + using var stream = SerializeStream(obj, longHeader); + if (stream == null) + return null; + + byte[] bytes = new byte[stream.Length]; + stream.Read(bytes, 0, bytes.Length); + return bytes; + } + + #endregion + + #region IFileSerializer + + /// + public static bool SerializeFile(MetadataFile? obj, string? path, bool longHeader = false) + { + var serializer = new AttractMode(); + return serializer.Serialize(obj, path, longHeader); + } + + /// + public override bool Serialize(MetadataFile? obj, string? path) => Serialize(obj, path, false); /// @@ -98,7 +122,7 @@ namespace SabreTools.Serialization.Serializers #region IStreamSerializer - /// + /// public static Stream? SerializeStream(MetadataFile? obj, bool longHeader = false) { var serializer = new AttractMode(); @@ -106,7 +130,7 @@ namespace SabreTools.Serialization.Serializers } /// - public Stream? Serialize(MetadataFile? obj) + public override Stream? Serialize(MetadataFile? obj) => Serialize(obj, false); /// diff --git a/SabreTools.Serialization/Serializers/BaseBinarySerializer.cs b/SabreTools.Serialization/Serializers/BaseBinarySerializer.cs new file mode 100644 index 00000000..2042c5fc --- /dev/null +++ b/SabreTools.Serialization/Serializers/BaseBinarySerializer.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using SabreTools.Serialization.Interfaces; + +namespace SabreTools.Serialization.Serializers +{ + /// + /// Base class for all binary serializers + /// + /// Type of the model to serialize + /// These methods assume there is a concrete implementation of the serializer for the model available + public abstract class BaseBinarySerializer : + IByteSerializer, + IFileSerializer, + IStreamSerializer + { + #region IByteSerializer + + /// + public virtual byte[]? SerializeArray(TModel? obj) + { + using var stream = SerializeStream(obj); + if (stream == null) + return null; + + byte[] bytes = new byte[stream.Length]; + stream.Read(bytes, 0, bytes.Length); + return bytes; + } + + #endregion + + #region IFileSerializer + + /// + public virtual bool Serialize(TModel? obj, string? path) + { + if (string.IsNullOrEmpty(path)) + return false; + + using var stream = SerializeStream(obj); + if (stream == null) + return false; + + using var fs = File.OpenWrite(path); + stream.CopyTo(fs); + return true; + } + + #endregion + + #region IStreamSerializer + + /// + public abstract Stream? Serialize(TModel? obj); + + #endregion + + #region Static Implementations + + /// + public static byte[]? SerializeBytes(TModel? obj) + { + var serializer = GetType>(); + if (serializer == null) + return default; + + return serializer.SerializeArray(obj); + } + + /// + public static bool SerializeFile(TModel? obj, string? path) + { + var serializer = GetType>(); + if (serializer == null) + return default; + + return serializer.Serialize(obj, path); + } + + /// + public static Stream? SerializeStream(TModel? obj) + { + var serializer = GetType>(); + if (serializer == null) + return default; + + return serializer.Serialize(obj); + } + + #endregion + + #region Helpers + + /// + /// Get a constructed instance of a type, if possible + /// + /// Serializer type to construct + /// Serializer of the requested type, null on error + private static TSerializer? GetType() + { + var assembly = Assembly.GetExecutingAssembly(); + if (assembly == null) + return default; + + // If not all types can be loaded, use the ones that could be + List assemblyTypes = []; + try + { + assemblyTypes = assembly.GetTypes().ToList(); + } + catch (ReflectionTypeLoadException rtle) + { + assemblyTypes = rtle.Types.Where(t => t != null)!.ToList(); + } + + // Loop through all types + foreach (Type type in assemblyTypes) + { + // If the type isn't a class or doesn't implement the interface + if (!type.IsClass || type.GetInterface(typeof(TSerializer).Name) == null) + continue; + + // Try to create a concrete instance of the type + var instance = (TSerializer?)Activator.CreateInstance(type); + if (instance != null) + return instance; + } + + return default; + } + + #endregion + } +} \ No newline at end of file diff --git a/SabreTools.Serialization/Serializers/Catalog.cs b/SabreTools.Serialization/Serializers/Catalog.cs index e91051ed..48274755 100644 --- a/SabreTools.Serialization/Serializers/Catalog.cs +++ b/SabreTools.Serialization/Serializers/Catalog.cs @@ -3,37 +3,10 @@ using System.Text; namespace SabreTools.Serialization.Serializers { - public class Catalog : - JsonFile + public class Catalog : JsonFile { - #region IFileSerializer - - /// - public static bool SerializeFile(Models.Xbox.Catalog? obj, string? path) - { - var serializer = new Catalog(); - return serializer.Serialize(obj, path); - } - - /// Catalog.js file is encoded as UTF-16 LE - public override bool Serialize(Models.Xbox.Catalog? obj, string? path) - => Serialize(obj, path, new UnicodeEncoding()); - - #endregion - - #region IStreamSerializer - - /// - public static Stream? SerializeStream(Models.Xbox.Catalog? obj) - { - var serializer = new Catalog(); - return serializer.Serialize(obj); - } - /// Catalog.js file is encoded as UTF-16 LE public override Stream? Serialize(Models.Xbox.Catalog? obj) => Serialize(obj, new UnicodeEncoding()); - - #endregion } } diff --git a/SabreTools.Serialization/Serializers/ClrMamePro.cs b/SabreTools.Serialization/Serializers/ClrMamePro.cs index dfcf09e9..da21e1eb 100644 --- a/SabreTools.Serialization/Serializers/ClrMamePro.cs +++ b/SabreTools.Serialization/Serializers/ClrMamePro.cs @@ -3,14 +3,38 @@ using System.Linq; using System.Text; using SabreTools.IO.Writers; using SabreTools.Models.ClrMamePro; -using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Serializers { - public class ClrMamePro : - IFileSerializer, - IStreamSerializer + public class ClrMamePro : BaseBinarySerializer { + #region IByteSerializer + + /// + public static byte[]? SerializeBytes(MetadataFile? obj, bool quotes = false) + { + var serializer = new ClrMamePro(); + return serializer.SerializeArray(obj, quotes); + } + + /// + public override byte[]? SerializeArray(MetadataFile? obj) + => SerializeArray(obj, false); + + /// + public byte[]? SerializeArray(MetadataFile? obj, bool quotes) + { + using var stream = SerializeStream(obj, quotes); + if (stream == null) + return null; + + byte[] bytes = new byte[stream.Length]; + stream.Read(bytes, 0, bytes.Length); + return bytes; + } + + #endregion + #region IFileSerializer /// @@ -21,7 +45,7 @@ namespace SabreTools.Serialization.Serializers } /// - public bool Serialize(MetadataFile? obj, string? path) + public override bool Serialize(MetadataFile? obj, string? path) => Serialize(obj, path, true); /// @@ -51,7 +75,7 @@ namespace SabreTools.Serialization.Serializers } /// - public Stream? Serialize(MetadataFile? obj) + public override Stream? Serialize(MetadataFile? obj) => Serialize(obj, true); /// diff --git a/SabreTools.Serialization/Serializers/CueSheet.cs b/SabreTools.Serialization/Serializers/CueSheet.cs index 15a63c33..428bd7a1 100644 --- a/SabreTools.Serialization/Serializers/CueSheet.cs +++ b/SabreTools.Serialization/Serializers/CueSheet.cs @@ -2,51 +2,13 @@ using System; using System.IO; using System.Text; using SabreTools.Models.CueSheets; -using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Serializers { - public class CueSheet : - IFileSerializer, - IStreamSerializer + public class CueSheet : BaseBinarySerializer { - #region IFileSerializer - - /// - public static bool SerializeFile(Models.CueSheets.CueSheet? obj, string? path) - { - var serializer = new CueSheet(); - return serializer.Serialize(obj, path); - } - /// - public bool Serialize(Models.CueSheets.CueSheet? obj, string? path) - { - if (string.IsNullOrEmpty(path)) - return false; - - using var stream = SerializeStream(obj); - if (stream == null) - return false; - - using var fs = File.OpenWrite(path); - stream.CopyTo(fs); - return true; - } - - #endregion - - #region IStreamSerializer - - /// - public static Stream? SerializeStream(Models.CueSheets.CueSheet? obj) - { - var serializer = new CueSheet(); - return serializer.Serialize(obj); - } - - /// - public Stream? Serialize(Models.CueSheets.CueSheet? obj) + public override Stream? Serialize(Models.CueSheets.CueSheet? obj) { // If the cuesheet is null if (obj == null) @@ -293,7 +255,5 @@ namespace SabreTools.Serialization.Serializers } #endregion - - #endregion } } \ No newline at end of file diff --git a/SabreTools.Serialization/Serializers/DosCenter.cs b/SabreTools.Serialization/Serializers/DosCenter.cs index 63ceb043..45241d5c 100644 --- a/SabreTools.Serialization/Serializers/DosCenter.cs +++ b/SabreTools.Serialization/Serializers/DosCenter.cs @@ -3,51 +3,13 @@ using System.Linq; using System.Text; using SabreTools.IO.Writers; using SabreTools.Models.DosCenter; -using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Serializers { - public class DosCenter : - IFileSerializer, - IStreamSerializer + public class DosCenter : BaseBinarySerializer { - #region IFileSerializer - - /// - public static bool SerializeFile(MetadataFile? obj, string? path) - { - var serializer = new DosCenter(); - return serializer.Serialize(obj, path); - } - /// - public bool Serialize(MetadataFile? obj, string? path) - { - if (string.IsNullOrEmpty(path)) - return false; - - using var stream = SerializeStream(obj); - if (stream == null) - return false; - - using var fs = System.IO.File.OpenWrite(path); - stream.CopyTo(fs); - return true; - } - - #endregion - - #region IStreamSerializer - - /// - public static Stream? SerializeStream(MetadataFile? obj) - { - var serializer = new DosCenter(); - return serializer.Serialize(obj); - } - - /// - public Stream? Serialize(MetadataFile? obj) + public override Stream? Serialize(MetadataFile? obj) { // If the metadata file is null if (obj == null) @@ -160,7 +122,5 @@ namespace SabreTools.Serialization.Serializers writer.WriteEndElement(); // file } } - - #endregion } } \ No newline at end of file diff --git a/SabreTools.Serialization/Serializers/EverdriveSMDB.cs b/SabreTools.Serialization/Serializers/EverdriveSMDB.cs index 6ec346fb..2684fdaf 100644 --- a/SabreTools.Serialization/Serializers/EverdriveSMDB.cs +++ b/SabreTools.Serialization/Serializers/EverdriveSMDB.cs @@ -4,51 +4,13 @@ using System.Linq; using System.Text; using SabreTools.IO.Writers; using SabreTools.Models.EverdriveSMDB; -using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Serializers { - public class EverdriveSMDB : - IFileSerializer, - IStreamSerializer + public class EverdriveSMDB : BaseBinarySerializer { - #region IFileSerializer - - /// - public static bool SerializeFile(MetadataFile? obj, string? path) - { - var serializer = new EverdriveSMDB(); - return serializer.Serialize(obj, path); - } - /// - public bool Serialize(MetadataFile? obj, string? path) - { - if (string.IsNullOrEmpty(path)) - return false; - - using var stream = SerializeStream(obj); - if (stream == null) - return false; - - using var fs = System.IO.File.OpenWrite(path); - stream.CopyTo(fs); - return true; - } - - #endregion - - #region IStreamSerializer - - /// - public static Stream? SerializeStream(MetadataFile? obj) - { - var serializer = new EverdriveSMDB(); - return serializer.Serialize(obj); - } - - /// - public Stream? Serialize(MetadataFile? obj) + public override Stream? Serialize(MetadataFile? obj) { // If the metadata file is null if (obj == null) @@ -99,7 +61,5 @@ namespace SabreTools.Serialization.Serializers writer.Flush(); } } - - #endregion } } \ No newline at end of file diff --git a/SabreTools.Serialization/Serializers/Hashfile.cs b/SabreTools.Serialization/Serializers/Hashfile.cs index c4439629..f28068e8 100644 --- a/SabreTools.Serialization/Serializers/Hashfile.cs +++ b/SabreTools.Serialization/Serializers/Hashfile.cs @@ -5,14 +5,39 @@ using System.Text; using SabreTools.Hashing; using SabreTools.IO.Writers; using SabreTools.Models.Hashfile; -using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Serializers { - public class Hashfile : - IFileSerializer, - IStreamSerializer + // TODO: Create variants for the implemented types + public class Hashfile : BaseBinarySerializer { + #region IByteSerializer + + /// + public static byte[]? SerializeBytes(Models.Hashfile.Hashfile? obj, HashType hash = HashType.CRC32) + { + var serializer = new Hashfile(); + return serializer.SerializeArray(obj, hash); + } + + /// + public override byte[]? SerializeArray(Models.Hashfile.Hashfile? obj) + => SerializeArray(obj, HashType.CRC32); + + /// + public byte[]? SerializeArray(Models.Hashfile.Hashfile? obj, HashType hash) + { + using var stream = SerializeStream(obj, hash); + if (stream == null) + return null; + + byte[] bytes = new byte[stream.Length]; + stream.Read(bytes, 0, bytes.Length); + return bytes; + } + + #endregion + #region IFileSerializer /// @@ -23,7 +48,7 @@ namespace SabreTools.Serialization.Serializers } /// - public bool Serialize(Models.Hashfile.Hashfile? obj, string? path) + public override bool Serialize(Models.Hashfile.Hashfile? obj, string? path) => Serialize(obj, path, HashType.CRC32); /// @@ -53,7 +78,7 @@ namespace SabreTools.Serialization.Serializers } /// - public Stream? Serialize(Models.Hashfile.Hashfile? obj) + public override Stream? Serialize(Models.Hashfile.Hashfile? obj) => Serialize(obj, HashType.CRC32); /// diff --git a/SabreTools.Serialization/Serializers/IRD.cs b/SabreTools.Serialization/Serializers/IRD.cs index 573b988e..5e64df16 100644 --- a/SabreTools.Serialization/Serializers/IRD.cs +++ b/SabreTools.Serialization/Serializers/IRD.cs @@ -2,51 +2,13 @@ using System; using System.IO; using System.Linq; using System.Text; -using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Serializers { - public class IRD : - IFileSerializer, - IStreamSerializer + public class IRD : BaseBinarySerializer { - #region IFileSerializer - - /// - public static bool SerializeFile(Models.IRD.File? obj, string? path) - { - var serializer = new IRD(); - return serializer.Serialize(obj, path); - } - /// - public bool Serialize(Models.IRD.File? obj, string? path) - { - if (string.IsNullOrEmpty(path)) - return false; - - using var stream = SerializeStream(obj); - if (stream == null) - return false; - - using var fs = System.IO.File.OpenWrite(path); - stream.CopyTo(fs); - return true; - } - - #endregion - - #region IStreamSerializer - - /// - public static Stream? SerializeStream(Models.IRD.File? obj) - { - var serializer = new IRD(); - return serializer.Serialize(obj); - } - - /// - public Stream? Serialize(Models.IRD.File? obj) + public override Stream? Serialize(Models.IRD.File? obj) { // If the data is invalid if (obj?.Magic == null) @@ -165,7 +127,5 @@ namespace SabreTools.Serialization.Serializers return stream; } - - #endregion } } \ No newline at end of file diff --git a/SabreTools.Serialization/Serializers/JsonFile.cs b/SabreTools.Serialization/Serializers/JsonFile.cs index 66291a28..8b41f716 100644 --- a/SabreTools.Serialization/Serializers/JsonFile.cs +++ b/SabreTools.Serialization/Serializers/JsonFile.cs @@ -1,7 +1,6 @@ using System.IO; using System.Text; using Newtonsoft.Json; -using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Serializers { @@ -9,14 +8,38 @@ namespace SabreTools.Serialization.Serializers /// Base class for other JSON serializers /// /// - public class JsonFile : - IFileSerializer, - IStreamSerializer + public class JsonFile : BaseBinarySerializer { + #region IByteSerializer + + /// + public override byte[]? SerializeArray(T? obj) + => SerializeArray(obj, new UTF8Encoding(false)); + + /// + /// Serialize a into a byte array + /// + /// Type of object to serialize from + /// Data to serialize + /// Encoding to parse text as + /// Filled object on success, null on error + public byte[]? SerializeArray(T? obj, Encoding encoding) + { + using var stream = Serialize(obj, encoding); + if (stream == null) + return null; + + byte[] bytes = new byte[stream.Length]; + stream.Read(bytes, 0, bytes.Length); + return bytes; + } + + #endregion + #region IFileSerializer /// - public virtual bool Serialize(T? obj, string? path) + public override bool Serialize(T? obj, string? path) => Serialize(obj, path, new UTF8Encoding(false)); /// @@ -47,7 +70,7 @@ namespace SabreTools.Serialization.Serializers #region IStreamSerializer /// - public virtual Stream? Serialize(T? obj) + public override Stream? Serialize(T? obj) => Serialize(obj, new UTF8Encoding(false)); /// diff --git a/SabreTools.Serialization/Serializers/Listrom.cs b/SabreTools.Serialization/Serializers/Listrom.cs index 12818c95..8c52473f 100644 --- a/SabreTools.Serialization/Serializers/Listrom.cs +++ b/SabreTools.Serialization/Serializers/Listrom.cs @@ -2,51 +2,13 @@ using System.IO; using System.Linq; using System.Text; using SabreTools.Models.Listrom; -using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Serializers { - public class Listrom : - IFileSerializer, - IStreamSerializer + public class Listrom : BaseBinarySerializer { - #region IFileSerializer - - /// - public static bool SerializeFile(MetadataFile? obj, string? path) - { - var serializer = new Listrom(); - return serializer.Serialize(obj, path); - } - /// - public bool Serialize(MetadataFile? obj, string? path) - { - if (string.IsNullOrEmpty(path)) - return false; - - using var stream = SerializeStream(obj); - if (stream == null) - return false; - - using var fs = File.OpenWrite(path); - stream.CopyTo(fs); - return true; - } - - #endregion - - #region IStreamSerializer - - /// - public static Stream? SerializeStream(MetadataFile? obj) - { - var serializer = new Listrom(); - return serializer.Serialize(obj); - } - - /// - public Stream? Serialize(MetadataFile? obj) + public override Stream? Serialize(MetadataFile? obj) { // If the metadata file is null if (obj == null) @@ -192,7 +154,5 @@ namespace SabreTools.Serialization.Serializers writer.Flush(); } } - - #endregion } } \ No newline at end of file diff --git a/SabreTools.Serialization/Serializers/Listxml.cs b/SabreTools.Serialization/Serializers/Listxml.cs index 964ffac5..5127ea1d 100644 --- a/SabreTools.Serialization/Serializers/Listxml.cs +++ b/SabreTools.Serialization/Serializers/Listxml.cs @@ -1,28 +1,7 @@ namespace SabreTools.Serialization.Serializers { - public class Listxml : - XmlFile + public class Listxml : XmlFile { - #region IFileSerializer - - /// - public static bool SerializeFile(Models.Listxml.Mame? obj, string? path) - { - var serializer = new Listxml(); - return serializer.Serialize(obj, path); - } - - #endregion - - #region IStreamSerializer - - /// - public static System.IO.Stream? SerializeStream(Models.Listxml.Mame? obj) - { - var serializer = new Listxml(); - return serializer.Serialize(obj); - } - - #endregion + // All logic taken care of in the base class } } \ No newline at end of file diff --git a/SabreTools.Serialization/Serializers/Logiqx.cs b/SabreTools.Serialization/Serializers/Logiqx.cs index 3a2c4e8a..5ecfce2d 100644 --- a/SabreTools.Serialization/Serializers/Logiqx.cs +++ b/SabreTools.Serialization/Serializers/Logiqx.cs @@ -3,8 +3,7 @@ using SabreTools.Models.Logiqx; namespace SabreTools.Serialization.Serializers { - public class Logiqx : - XmlFile + public class Logiqx : XmlFile { #region Constants @@ -30,15 +29,16 @@ namespace SabreTools.Serialization.Serializers #endregion + #region IByteSerializer + + /// + public override byte[]? SerializeArray(Datafile? obj) + => SerializeArray(obj, DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSysId); + + #endregion + #region IFileSerializer - /// - public static bool SerializeFile(Datafile? obj, string? path) - { - var serializer = new Logiqx(); - return serializer.Serialize(obj, path); - } - /// public override bool Serialize(Datafile? obj, string? path) => Serialize(obj, path, DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSysId); @@ -47,13 +47,6 @@ namespace SabreTools.Serialization.Serializers #region IStreamSerializer - /// - public static Stream? SerializeStream(Datafile? obj) - { - var serializer = new Logiqx(); - return serializer.Serialize(obj); - } - /// public override Stream? Serialize(Datafile? obj) => Serialize(obj, DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSysId); diff --git a/SabreTools.Serialization/Serializers/M1.cs b/SabreTools.Serialization/Serializers/M1.cs index 78541224..25fa12c6 100644 --- a/SabreTools.Serialization/Serializers/M1.cs +++ b/SabreTools.Serialization/Serializers/M1.cs @@ -1,28 +1,7 @@ namespace SabreTools.Serialization.Serializers { - public class M1 : - XmlFile + public class M1 : XmlFile { - #region IFileSerializer - - /// - public static bool SerializeFile(Models.Listxml.M1? obj, string? path) - { - var serializer = new M1(); - return serializer.Serialize(obj, path); - } - - #endregion - - #region IStreamSerializer - - /// - public static System.IO.Stream? SerializeStream(Models.Listxml.M1? obj) - { - var serializer = new M1(); - return serializer.Serialize(obj); - } - - #endregion + // All logic taken care of in the base class } } \ No newline at end of file diff --git a/SabreTools.Serialization/Serializers/OfflineList.cs b/SabreTools.Serialization/Serializers/OfflineList.cs index 49342ba8..007acfcc 100644 --- a/SabreTools.Serialization/Serializers/OfflineList.cs +++ b/SabreTools.Serialization/Serializers/OfflineList.cs @@ -1,28 +1,7 @@ namespace SabreTools.Serialization.Serializers { - public class OfflineList : - XmlFile + public class OfflineList : XmlFile { - #region IFileSerializer - - /// - public static bool SerializeFile(Models.OfflineList.Dat? obj, string? path) - { - var serializer = new OfflineList(); - return serializer.Serialize(obj, path); - } - - #endregion - - #region IStreamSerializer - - /// - public static System.IO.Stream? SerializeStream(Models.OfflineList.Dat? obj) - { - var serializer = new OfflineList(); - return serializer.Serialize(obj); - } - - #endregion + // All logic taken care of in the base class } } \ No newline at end of file diff --git a/SabreTools.Serialization/Serializers/OpenMSX.cs b/SabreTools.Serialization/Serializers/OpenMSX.cs index 56ab36ce..a6364f0d 100644 --- a/SabreTools.Serialization/Serializers/OpenMSX.cs +++ b/SabreTools.Serialization/Serializers/OpenMSX.cs @@ -3,8 +3,7 @@ using SabreTools.Models.OpenMSX; namespace SabreTools.Serialization.Serializers { - public class OpenMSX : - XmlFile + public class OpenMSX : XmlFile { #region Constants @@ -30,15 +29,16 @@ namespace SabreTools.Serialization.Serializers #endregion + #region IByteSerializer + + /// + public override byte[]? SerializeArray(SoftwareDb? obj) + => SerializeArray(obj, DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSysId); + + #endregion + #region IFileSerializer - /// - public static bool SerializeFile(SoftwareDb? obj, string? path) - { - var serializer = new OpenMSX(); - return serializer.Serialize(obj, path); - } - /// public override bool Serialize(SoftwareDb? obj, string? path) => Serialize(obj, path, DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSysId); @@ -47,13 +47,6 @@ namespace SabreTools.Serialization.Serializers #region IStreamSerializer - /// - public static Stream? SerializeStream(SoftwareDb? obj) - { - var serializer = new OpenMSX(); - return serializer.Serialize(obj); - } - /// public override Stream? Serialize(SoftwareDb? obj) => Serialize(obj, DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSysId); diff --git a/SabreTools.Serialization/Serializers/RomCenter.cs b/SabreTools.Serialization/Serializers/RomCenter.cs index 51f89641..54f38b8d 100644 --- a/SabreTools.Serialization/Serializers/RomCenter.cs +++ b/SabreTools.Serialization/Serializers/RomCenter.cs @@ -3,51 +3,13 @@ using System.Linq; using System.Text; using SabreTools.IO.Writers; using SabreTools.Models.RomCenter; -using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Serializers { - public class RomCenter : - IFileSerializer, - IStreamSerializer + public class RomCenter : BaseBinarySerializer { - #region IFileSerializer - - /// - public static bool SerializeFile(MetadataFile? obj, string? path) - { - var serializer = new RomCenter(); - return serializer.Serialize(obj, path); - } - /// - public bool Serialize(MetadataFile? obj, string? path) - { - if (string.IsNullOrEmpty(path)) - return false; - - using var stream = SerializeStream(obj); - if (stream == null) - return false; - - using var fs = File.OpenWrite(path); - stream.CopyTo(fs); - return true; - } - - #endregion - - #region IStreamSerializer - - /// - public static Stream? SerializeStream(MetadataFile? obj) - { - var serializer = new RomCenter(); - return serializer.Serialize(obj); - } - - /// - public Stream? Serialize(MetadataFile? obj) + public override Stream? Serialize(MetadataFile? obj) { // If the metadata file is null if (obj == null) @@ -199,7 +161,5 @@ namespace SabreTools.Serialization.Serializers writer.WriteLine(); writer.Flush(); } - - #endregion } } \ No newline at end of file diff --git a/SabreTools.Serialization/Serializers/SeparatedValue.cs b/SabreTools.Serialization/Serializers/SeparatedValue.cs index d83317d6..6e09613e 100644 --- a/SabreTools.Serialization/Serializers/SeparatedValue.cs +++ b/SabreTools.Serialization/Serializers/SeparatedValue.cs @@ -3,14 +3,39 @@ using System.Linq; using System.Text; using SabreTools.IO.Writers; using SabreTools.Models.SeparatedValue; -using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Serializers { - public class SeparatedValue : - IFileSerializer, - IStreamSerializer + // TODO: Create variants for the 3 common types: CSV, SSV, TSV + public class SeparatedValue : BaseBinarySerializer { + #region IByteSerializer + + /// + public static byte[]? SerializeBytes(MetadataFile? obj, char delim = ',', bool longHeader = false) + { + var serializer = new SeparatedValue(); + return serializer.SerializeArray(obj, delim, longHeader); + } + + /// + public override byte[]? SerializeArray(MetadataFile? obj) + => SerializeArray(obj, ',', false); + + /// + public byte[]? SerializeArray(MetadataFile? obj, char delim, bool longHeader) + { + using var stream = SerializeStream(obj, delim, longHeader); + if (stream == null) + return null; + + byte[] bytes = new byte[stream.Length]; + stream.Read(bytes, 0, bytes.Length); + return bytes; + } + + #endregion + #region IFileSerializer /// @@ -21,7 +46,7 @@ namespace SabreTools.Serialization.Serializers } /// - public bool Serialize(MetadataFile? obj, string? path) + public override bool Serialize(MetadataFile? obj, string? path) => Serialize(obj, path, ',', false); /// @@ -51,7 +76,7 @@ namespace SabreTools.Serialization.Serializers } /// - public Stream? Serialize(MetadataFile? obj) + public override Stream? Serialize(MetadataFile? obj) => Serialize(obj, ',', false); /// diff --git a/SabreTools.Serialization/Serializers/SoftwareList.cs b/SabreTools.Serialization/Serializers/SoftwareList.cs index 083256be..24b04f2c 100644 --- a/SabreTools.Serialization/Serializers/SoftwareList.cs +++ b/SabreTools.Serialization/Serializers/SoftwareList.cs @@ -2,8 +2,7 @@ using System.IO; namespace SabreTools.Serialization.Serializers { - public class SoftwareList : - XmlFile + public class SoftwareList : XmlFile { #region Constants @@ -31,13 +30,6 @@ namespace SabreTools.Serialization.Serializers #region IFileSerializer - /// - public static bool SerializeFile(Models.SoftwareList.SoftwareList? obj, string? path) - { - var serializer = new SoftwareList(); - return serializer.Serialize(obj, path); - } - /// public override bool Serialize(Models.SoftwareList.SoftwareList? obj, string? path) => Serialize(obj, path, DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSysId); @@ -46,13 +38,6 @@ namespace SabreTools.Serialization.Serializers #region IStreamSerializer - /// - public static Stream? SerializeStream(Models.SoftwareList.SoftwareList? obj) - { - var serializer = new SoftwareList(); - return serializer.Serialize(obj); - } - /// public override Stream? Serialize(Models.SoftwareList.SoftwareList? obj) => Serialize(obj, DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSysId); diff --git a/SabreTools.Serialization/Serializers/XMID.cs b/SabreTools.Serialization/Serializers/XMID.cs index 5e829b48..629b412b 100644 --- a/SabreTools.Serialization/Serializers/XMID.cs +++ b/SabreTools.Serialization/Serializers/XMID.cs @@ -3,8 +3,7 @@ using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Serializers { - public partial class XMID : - IStringSerializer + public partial class XMID : IStringSerializer { #region IStringSerializer diff --git a/SabreTools.Serialization/Serializers/XeMID.cs b/SabreTools.Serialization/Serializers/XeMID.cs index b7474253..5f92fcae 100644 --- a/SabreTools.Serialization/Serializers/XeMID.cs +++ b/SabreTools.Serialization/Serializers/XeMID.cs @@ -3,8 +3,7 @@ using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Serializers { - public partial class XeMID : - IStringSerializer + public partial class XeMID : IStringSerializer { #region IStringSerializer diff --git a/SabreTools.Serialization/Serializers/XmlFile.cs b/SabreTools.Serialization/Serializers/XmlFile.cs index 18d8d6d8..a185c675 100644 --- a/SabreTools.Serialization/Serializers/XmlFile.cs +++ b/SabreTools.Serialization/Serializers/XmlFile.cs @@ -2,7 +2,6 @@ using System.IO; using System.Text; using System.Xml; using System.Xml.Serialization; -using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Serializers { @@ -10,14 +9,40 @@ namespace SabreTools.Serialization.Serializers /// Base class for other XML serializers /// /// - public class XmlFile : - IFileSerializer, - IStreamSerializer + public class XmlFile : BaseBinarySerializer { + #region IByteSerializer + + /// + public override byte[]? SerializeArray(T? obj) + => SerializeArray(obj, null, null, null, null); + + /// + /// Serializes the defined type to a byte array + /// + /// Data to serialize + /// Optional DOCTYPE name + /// Optional DOCTYPE pubid + /// Optional DOCTYPE sysid + /// Optional DOCTYPE name + /// Byte array containing serialized data on success, null otherwise + 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); + if (stream == null) + return null; + + byte[] bytes = new byte[stream.Length]; + stream.Read(bytes, 0, bytes.Length); + return bytes; + } + + #endregion + #region IFileSerializer /// - public virtual bool Serialize(T? obj, string? path) + public override bool Serialize(T? obj, string? path) => Serialize(obj, path, null, null, null, null); /// @@ -49,12 +74,8 @@ namespace SabreTools.Serialization.Serializers #region IStreamSerializer - /// - /// Serializes the defined type to a stream - /// - /// Data to serialize - /// Stream containing serialized data on success, null otherwise - public virtual Stream? Serialize(T? obj) + /// + public override Stream? Serialize(T? obj) => Serialize(obj, null, null, null, null); ///