Create base class for serializers

This commit is contained in:
Matt Nadareski
2024-04-04 02:42:25 -04:00
parent bc01ce4552
commit 2a4d24309d
25 changed files with 385 additions and 469 deletions

View File

@@ -73,6 +73,7 @@ namespace SabreTools.Serialization.Deserializers
var deserializer = GetType<IFileDeserializer<TModel>>();
if (deserializer == null)
return default;
return deserializer.Deserialize(path);
}
@@ -127,7 +128,7 @@ namespace SabreTools.Serialization.Deserializers
return default;
}
#endregion
}
}

View File

@@ -0,0 +1,16 @@
namespace SabreTools.Serialization.Interfaces
{
/// <summary>
/// Defines how to serialize to byte arrays
/// </summary>
public interface IByteSerializer<T>
{
/// <summary>
/// Serialize a <typeparamref name="T"/> into a byte array
/// </summary>
/// <typeparam name="T">Type of object to serialize from</typeparam>
/// <param name="obj">Data to serialize</param>
/// <returns>Filled object on success, null on error</returns>
byte[]? SerializeArray(T? obj);
}
}

View File

@@ -2,26 +2,6 @@ namespace SabreTools.Serialization.Serializers
{
public class ArchiveDotOrg : XmlFile<Models.ArchiveDotOrg.Files>
{
#region IFileSerializer
/// <inheritdoc cref="Interfaces.IFileSerializer.Serialize(T?, string?)"/>
public static bool SerializeFile(Models.ArchiveDotOrg.Files? obj, string? path)
{
var serializer = new ArchiveDotOrg();
return serializer.Serialize(obj, path);
}
#endregion
#region IStreamSerializer
/// <inheritdoc cref="Interfaces.IStreamSerializer.Serialize(T?)"/>
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
}
}

View File

@@ -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<MetadataFile>,
IStreamSerializer<MetadataFile>
public class AttractMode : BaseBinarySerializer<MetadataFile>
{
#region Constants
@@ -66,17 +63,44 @@ namespace SabreTools.Serialization.Serializers
#endregion
#region IFileSerializer
#region IByteSerializer
/// <inheritdoc cref="IFileSerializer.Serialize(T?, string?)"/>
public static bool SerializeFile(MetadataFile? obj, string? path, bool longHeader = false)
/// <inheritdoc cref="Interfaces.IByteSerializer.SerializeArray(T?)"/>
public static byte[]? SerializeBytes(MetadataFile? obj, bool longHeader = false)
{
var serializer = new AttractMode();
return serializer.Serialize(obj, path);
return serializer.SerializeArray(obj, longHeader);
}
/// <inheritdoc/>
public bool Serialize(MetadataFile? obj, string? path)
public override byte[]? SerializeArray(MetadataFile? obj)
=> SerializeArray(obj, false);
/// <inheritdoc/>
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
/// <inheritdoc cref="Interfaces.IFileSerializer.Serialize(T?, string?)"/>
public static bool SerializeFile(MetadataFile? obj, string? path, bool longHeader = false)
{
var serializer = new AttractMode();
return serializer.Serialize(obj, path, longHeader);
}
/// <inheritdoc/>
public override bool Serialize(MetadataFile? obj, string? path)
=> Serialize(obj, path, false);
/// <inheritdoc/>
@@ -98,7 +122,7 @@ namespace SabreTools.Serialization.Serializers
#region IStreamSerializer
/// <inheritdoc cref="IStreamSerializer.Serialize(T?)"/>
/// <inheritdoc cref="Interfaces.IStreamSerializer.Serialize(T?)"/>
public static Stream? SerializeStream(MetadataFile? obj, bool longHeader = false)
{
var serializer = new AttractMode();
@@ -106,7 +130,7 @@ namespace SabreTools.Serialization.Serializers
}
/// <inheritdoc/>
public Stream? Serialize(MetadataFile? obj)
public override Stream? Serialize(MetadataFile? obj)
=> Serialize(obj, false);
/// <inheritdoc/>

View File

@@ -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
{
/// <summary>
/// Base class for all binary serializers
/// </summary>
/// <typeparam name="TModel">Type of the model to serialize</typeparam>
/// <remarks>These methods assume there is a concrete implementation of the serializer for the model available</remarks>
public abstract class BaseBinarySerializer<TModel> :
IByteSerializer<TModel>,
IFileSerializer<TModel>,
IStreamSerializer<TModel>
{
#region IByteSerializer
/// <inheritdoc/>
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
/// <inheritdoc/>
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
/// <inheritdoc/>
public abstract Stream? Serialize(TModel? obj);
#endregion
#region Static Implementations
/// <inheritdoc cref="IByteSerializer.Deserialize(T?)"/>
public static byte[]? SerializeBytes(TModel? obj)
{
var serializer = GetType<IByteSerializer<TModel>>();
if (serializer == null)
return default;
return serializer.SerializeArray(obj);
}
/// <inheritdoc cref="IFileSerializer.Serialize(T?, string?)"/>
public static bool SerializeFile(TModel? obj, string? path)
{
var serializer = GetType<IFileSerializer<TModel>>();
if (serializer == null)
return default;
return serializer.Serialize(obj, path);
}
/// <inheritdoc cref="IStreamSerializer.Serialize(T?)"/>
public static Stream? SerializeStream(TModel? obj)
{
var serializer = GetType<IStreamSerializer<TModel>>();
if (serializer == null)
return default;
return serializer.Serialize(obj);
}
#endregion
#region Helpers
/// <summary>
/// Get a constructed instance of a type, if possible
/// </summary>
/// <typeparam name="TSerializer">Serializer type to construct</typeparam>
/// <returns>Serializer of the requested type, null on error</returns>
private static TSerializer? GetType<TSerializer>()
{
var assembly = Assembly.GetExecutingAssembly();
if (assembly == null)
return default;
// If not all types can be loaded, use the ones that could be
List<Type> assemblyTypes = [];
try
{
assemblyTypes = assembly.GetTypes().ToList<Type>();
}
catch (ReflectionTypeLoadException rtle)
{
assemblyTypes = rtle.Types.Where(t => t != null)!.ToList<Type>();
}
// 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
}
}

View File

@@ -3,37 +3,10 @@ using System.Text;
namespace SabreTools.Serialization.Serializers
{
public class Catalog :
JsonFile<Models.Xbox.Catalog>
public class Catalog : JsonFile<Models.Xbox.Catalog>
{
#region IFileSerializer
/// <inheritdoc cref="IFileSerializer.Serialize(T?, string?)"/>
public static bool SerializeFile(Models.Xbox.Catalog? obj, string? path)
{
var serializer = new Catalog();
return serializer.Serialize(obj, path);
}
/// <remarks>Catalog.js file is encoded as UTF-16 LE</remarks>
public override bool Serialize(Models.Xbox.Catalog? obj, string? path)
=> Serialize(obj, path, new UnicodeEncoding());
#endregion
#region IStreamSerializer
/// <inheritdoc cref="IStreamSerializer.Serialize(T?)"/>
public static Stream? SerializeStream(Models.Xbox.Catalog? obj)
{
var serializer = new Catalog();
return serializer.Serialize(obj);
}
/// <remarks>Catalog.js file is encoded as UTF-16 LE</remarks>
public override Stream? Serialize(Models.Xbox.Catalog? obj)
=> Serialize(obj, new UnicodeEncoding());
#endregion
}
}

View File

@@ -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<MetadataFile>,
IStreamSerializer<MetadataFile>
public class ClrMamePro : BaseBinarySerializer<MetadataFile>
{
#region IByteSerializer
/// <inheritdoc cref="Interfaces.IByteSerializer.SerializeArray(T?)"/>
public static byte[]? SerializeBytes(MetadataFile? obj, bool quotes = false)
{
var serializer = new ClrMamePro();
return serializer.SerializeArray(obj, quotes);
}
/// <inheritdoc/>
public override byte[]? SerializeArray(MetadataFile? obj)
=> SerializeArray(obj, false);
/// <inheritdoc/>
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
/// <inheritdoc cref="IFileSerializer.Serialize(T?, string?)"/>
@@ -21,7 +45,7 @@ namespace SabreTools.Serialization.Serializers
}
/// <inheritdoc/>
public bool Serialize(MetadataFile? obj, string? path)
public override bool Serialize(MetadataFile? obj, string? path)
=> Serialize(obj, path, true);
/// <inheritdoc cref="Serialize(MetadataFile, string)"/>
@@ -51,7 +75,7 @@ namespace SabreTools.Serialization.Serializers
}
/// <inheritdoc/>
public Stream? Serialize(MetadataFile? obj)
public override Stream? Serialize(MetadataFile? obj)
=> Serialize(obj, true);
/// <inheritdoc cref="Serialize(MetadataFile)"/>

View File

@@ -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<Models.CueSheets.CueSheet>,
IStreamSerializer<Models.CueSheets.CueSheet>
public class CueSheet : BaseBinarySerializer<Models.CueSheets.CueSheet>
{
#region IFileSerializer
/// <inheritdoc cref="IFileSerializer.Serialize(T?, string?)"/>
public static bool SerializeFile(Models.CueSheets.CueSheet? obj, string? path)
{
var serializer = new CueSheet();
return serializer.Serialize(obj, path);
}
/// <inheritdoc/>
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
/// <inheritdoc cref="IStreamSerializer.Serialize(T?)"/>
public static Stream? SerializeStream(Models.CueSheets.CueSheet? obj)
{
var serializer = new CueSheet();
return serializer.Serialize(obj);
}
/// <inheritdoc/>
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
}
}

View File

@@ -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<MetadataFile>,
IStreamSerializer<MetadataFile>
public class DosCenter : BaseBinarySerializer<MetadataFile>
{
#region IFileSerializer
/// <inheritdoc cref="IFileSerializer.Serialize(T?, string?)"/>
public static bool SerializeFile(MetadataFile? obj, string? path)
{
var serializer = new DosCenter();
return serializer.Serialize(obj, path);
}
/// <inheritdoc/>
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
/// <inheritdoc cref="IStreamSerializer.Serialize(T?)"/>
public static Stream? SerializeStream(MetadataFile? obj)
{
var serializer = new DosCenter();
return serializer.Serialize(obj);
}
/// <inheritdoc/>
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
}
}

View File

@@ -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<MetadataFile>,
IStreamSerializer<MetadataFile>
public class EverdriveSMDB : BaseBinarySerializer<MetadataFile>
{
#region IFileSerializer
/// <inheritdoc cref="IFileSerializer.Serialize(T?, string?)"/>
public static bool SerializeFile(MetadataFile? obj, string? path)
{
var serializer = new EverdriveSMDB();
return serializer.Serialize(obj, path);
}
/// <inheritdoc/>
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
/// <inheritdoc cref="IStreamSerializer.Serialize(T?)"/>
public static Stream? SerializeStream(MetadataFile? obj)
{
var serializer = new EverdriveSMDB();
return serializer.Serialize(obj);
}
/// <inheritdoc/>
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
}
}

View File

@@ -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<Models.Hashfile.Hashfile>,
IStreamSerializer<Models.Hashfile.Hashfile>
// TODO: Create variants for the implemented types
public class Hashfile : BaseBinarySerializer<Models.Hashfile.Hashfile>
{
#region IByteSerializer
/// <inheritdoc cref="Interfaces.IByteSerializer.SerializeArray(T?)"/>
public static byte[]? SerializeBytes(Models.Hashfile.Hashfile? obj, HashType hash = HashType.CRC32)
{
var serializer = new Hashfile();
return serializer.SerializeArray(obj, hash);
}
/// <inheritdoc/>
public override byte[]? SerializeArray(Models.Hashfile.Hashfile? obj)
=> SerializeArray(obj, HashType.CRC32);
/// <inheritdoc/>
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
/// <inheritdoc cref="IFileSerializer.Serialize(T?, string?)"/>
@@ -23,7 +48,7 @@ namespace SabreTools.Serialization.Serializers
}
/// <inheritdoc/>
public bool Serialize(Models.Hashfile.Hashfile? obj, string? path)
public override bool Serialize(Models.Hashfile.Hashfile? obj, string? path)
=> Serialize(obj, path, HashType.CRC32);
/// <inheritdoc/>
@@ -53,7 +78,7 @@ namespace SabreTools.Serialization.Serializers
}
/// <inheritdoc/>
public Stream? Serialize(Models.Hashfile.Hashfile? obj)
public override Stream? Serialize(Models.Hashfile.Hashfile? obj)
=> Serialize(obj, HashType.CRC32);
/// <inheritdoc/>

View File

@@ -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<Models.IRD.File>,
IStreamSerializer<Models.IRD.File>
public class IRD : BaseBinarySerializer<Models.IRD.File>
{
#region IFileSerializer
/// <inheritdoc cref="IFileSerializer.Serialize(T?, string?)"/>
public static bool SerializeFile(Models.IRD.File? obj, string? path)
{
var serializer = new IRD();
return serializer.Serialize(obj, path);
}
/// <inheritdoc/>
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
/// <inheritdoc cref="IStreamSerializer.Serialize(T?)"/>
public static Stream? SerializeStream(Models.IRD.File? obj)
{
var serializer = new IRD();
return serializer.Serialize(obj);
}
/// <inheritdoc/>
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
}
}

View File

@@ -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
/// </summary>
/// <typeparam name="T"></typeparam>
public class JsonFile<T> :
IFileSerializer<T>,
IStreamSerializer<T>
public class JsonFile<T> : BaseBinarySerializer<T>
{
#region IByteSerializer
/// <inheritdoc/>
public override byte[]? SerializeArray(T? obj)
=> SerializeArray(obj, new UTF8Encoding(false));
/// <summary>
/// Serialize a <typeparamref name="T"/> into a byte array
/// </summary>
/// <typeparam name="T">Type of object to serialize from</typeparam>
/// <param name="obj">Data to serialize</param>
/// <param name="encoding">Encoding to parse text as</param>
/// <returns>Filled object on success, null on error</returns>
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
/// <inheritdoc/>
public virtual bool Serialize(T? obj, string? path)
public override bool Serialize(T? obj, string? path)
=> Serialize(obj, path, new UTF8Encoding(false));
/// <summary>
@@ -47,7 +70,7 @@ namespace SabreTools.Serialization.Serializers
#region IStreamSerializer
/// <inheritdoc/>
public virtual Stream? Serialize(T? obj)
public override Stream? Serialize(T? obj)
=> Serialize(obj, new UTF8Encoding(false));
/// <summary>

View File

@@ -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<MetadataFile>,
IStreamSerializer<MetadataFile>
public class Listrom : BaseBinarySerializer<MetadataFile>
{
#region IFileSerializer
/// <inheritdoc cref="IFileSerializer.Serialize(T?, string?)"/>
public static bool SerializeFile(MetadataFile? obj, string? path)
{
var serializer = new Listrom();
return serializer.Serialize(obj, path);
}
/// <inheritdoc/>
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
/// <inheritdoc cref="IStreamSerializer.Serialize(T?)"/>
public static Stream? SerializeStream(MetadataFile? obj)
{
var serializer = new Listrom();
return serializer.Serialize(obj);
}
/// <inheritdoc/>
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
}
}

View File

@@ -1,28 +1,7 @@
namespace SabreTools.Serialization.Serializers
{
public class Listxml :
XmlFile<Models.Listxml.Mame>
public class Listxml : XmlFile<Models.Listxml.Mame>
{
#region IFileSerializer
/// <inheritdoc cref="Interfaces.IFileSerializer.Serialize(T?, string?)"/>
public static bool SerializeFile(Models.Listxml.Mame? obj, string? path)
{
var serializer = new Listxml();
return serializer.Serialize(obj, path);
}
#endregion
#region IStreamSerializer
/// <inheritdoc cref="Interfaces.IStreamSerializer.Serialize(T?)"/>
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
}
}

View File

@@ -3,8 +3,7 @@ using SabreTools.Models.Logiqx;
namespace SabreTools.Serialization.Serializers
{
public class Logiqx :
XmlFile<Datafile>
public class Logiqx : XmlFile<Datafile>
{
#region Constants
@@ -30,15 +29,16 @@ namespace SabreTools.Serialization.Serializers
#endregion
#region IByteSerializer
/// <inheritdoc cref="XmlFile.SerializeArray(T?, string?, string?, string?, string?)" />
public override byte[]? SerializeArray(Datafile? obj)
=> SerializeArray(obj, DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSysId);
#endregion
#region IFileSerializer
/// <inheritdoc cref="Interfaces.IFileSerializer.Serialize(T?, string?)"/>
public static bool SerializeFile(Datafile? obj, string? path)
{
var serializer = new Logiqx();
return serializer.Serialize(obj, path);
}
/// <inheritdoc cref="XmlFile.Serialize(T?, string?, string?, string?, string?, string?)" />
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
/// <inheritdoc cref="IStreamSerializer.Serialize(T?)"/>
public static Stream? SerializeStream(Datafile? obj)
{
var serializer = new Logiqx();
return serializer.Serialize(obj);
}
/// <inheritdoc cref="XmlFile.Serialize(T?, string?, string?, string?, string?)" />
public override Stream? Serialize(Datafile? obj)
=> Serialize(obj, DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSysId);

View File

@@ -1,28 +1,7 @@
namespace SabreTools.Serialization.Serializers
{
public class M1 :
XmlFile<Models.Listxml.M1>
public class M1 : XmlFile<Models.Listxml.M1>
{
#region IFileSerializer
/// <inheritdoc cref="Interfaces.IFileSerializer.Serialize(T?, string?)"/>
public static bool SerializeFile(Models.Listxml.M1? obj, string? path)
{
var serializer = new M1();
return serializer.Serialize(obj, path);
}
#endregion
#region IStreamSerializer
/// <inheritdoc cref="Interfaces.IStreamSerializer.Serialize(T?)"/>
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
}
}

View File

@@ -1,28 +1,7 @@
namespace SabreTools.Serialization.Serializers
{
public class OfflineList :
XmlFile<Models.OfflineList.Dat>
public class OfflineList : XmlFile<Models.OfflineList.Dat>
{
#region IFileSerializer
/// <inheritdoc cref="Interfaces.IFileSerializer.Serialize(T?, string?)"/>
public static bool SerializeFile(Models.OfflineList.Dat? obj, string? path)
{
var serializer = new OfflineList();
return serializer.Serialize(obj, path);
}
#endregion
#region IStreamSerializer
/// <inheritdoc cref="Interfaces.IStreamSerializer.Serialize(T?)"/>
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
}
}

View File

@@ -3,8 +3,7 @@ using SabreTools.Models.OpenMSX;
namespace SabreTools.Serialization.Serializers
{
public class OpenMSX :
XmlFile<SoftwareDb>
public class OpenMSX : XmlFile<SoftwareDb>
{
#region Constants
@@ -30,15 +29,16 @@ namespace SabreTools.Serialization.Serializers
#endregion
#region IByteSerializer
/// <inheritdoc cref="XmlFile.SerializeArray(T?, string?, string?, string?, string?)" />
public override byte[]? SerializeArray(SoftwareDb? obj)
=> SerializeArray(obj, DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSysId);
#endregion
#region IFileSerializer
/// <inheritdoc cref="Interfaces.IFileSerializer.Serialize(T?, string?)"/>
public static bool SerializeFile(SoftwareDb? obj, string? path)
{
var serializer = new OpenMSX();
return serializer.Serialize(obj, path);
}
/// <inheritdoc cref="XmlFile.Serialize(T?, string?, string?, string?, string?, string?)" />
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
/// <inheritdoc cref="Interfaces.IStreamSerializer.Serialize(T?)"/>
public static Stream? SerializeStream(SoftwareDb? obj)
{
var serializer = new OpenMSX();
return serializer.Serialize(obj);
}
/// <inheritdoc cref="XmlFile.Serialize(T?, string?, string?, string?, string?)" />
public override Stream? Serialize(SoftwareDb? obj)
=> Serialize(obj, DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSysId);

View File

@@ -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<MetadataFile>,
IStreamSerializer<MetadataFile>
public class RomCenter : BaseBinarySerializer<MetadataFile>
{
#region IFileSerializer
/// <inheritdoc cref="IFileSerializer.Serialize(T?, string?)"/>
public static bool SerializeFile(MetadataFile? obj, string? path)
{
var serializer = new RomCenter();
return serializer.Serialize(obj, path);
}
/// <inheritdoc/>
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
/// <inheritdoc cref="IStreamSerializer.Serialize(T?)"/>
public static Stream? SerializeStream(MetadataFile? obj)
{
var serializer = new RomCenter();
return serializer.Serialize(obj);
}
/// <inheritdoc/>
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
}
}

View File

@@ -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<MetadataFile>,
IStreamSerializer<MetadataFile>
// TODO: Create variants for the 3 common types: CSV, SSV, TSV
public class SeparatedValue : BaseBinarySerializer<MetadataFile>
{
#region IByteSerializer
/// <inheritdoc cref="Interfaces.IByteSerializer.SerializeArray(T?)"/>
public static byte[]? SerializeBytes(MetadataFile? obj, char delim = ',', bool longHeader = false)
{
var serializer = new SeparatedValue();
return serializer.SerializeArray(obj, delim, longHeader);
}
/// <inheritdoc/>
public override byte[]? SerializeArray(MetadataFile? obj)
=> SerializeArray(obj, ',', false);
/// <inheritdoc/>
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
/// <inheritdoc cref="IFileSerializer.Serialize(T?, string?)"/>
@@ -21,7 +46,7 @@ namespace SabreTools.Serialization.Serializers
}
/// <inheritdoc/>
public bool Serialize(MetadataFile? obj, string? path)
public override bool Serialize(MetadataFile? obj, string? path)
=> Serialize(obj, path, ',', false);
/// <inheritdoc/>
@@ -51,7 +76,7 @@ namespace SabreTools.Serialization.Serializers
}
/// <inheritdoc/>
public Stream? Serialize(MetadataFile? obj)
public override Stream? Serialize(MetadataFile? obj)
=> Serialize(obj, ',', false);
/// <inheritdoc cref="Serialize(MetadataFile)"/>

View File

@@ -2,8 +2,7 @@ using System.IO;
namespace SabreTools.Serialization.Serializers
{
public class SoftwareList :
XmlFile<Models.SoftwareList.SoftwareList>
public class SoftwareList : XmlFile<Models.SoftwareList.SoftwareList>
{
#region Constants
@@ -31,13 +30,6 @@ namespace SabreTools.Serialization.Serializers
#region IFileSerializer
/// <inheritdoc cref="Interfaces.IFileSerializer.Serialize(T?, string?)"/>
public static bool SerializeFile(Models.SoftwareList.SoftwareList? obj, string? path)
{
var serializer = new SoftwareList();
return serializer.Serialize(obj, path);
}
/// <inheritdoc cref="XmlFile.Serialize(T?, string?, string?, string?, string?, string?)" />
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
/// <inheritdoc cref="Interfaces.IStreamSerializer.Serialize(T?)"/>
public static Stream? SerializeStream(Models.SoftwareList.SoftwareList? obj)
{
var serializer = new SoftwareList();
return serializer.Serialize(obj);
}
/// <inheritdoc cref="XmlFile.Serialize(T?, string?, string?, string?, string?)" />
public override Stream? Serialize(Models.SoftwareList.SoftwareList? obj)
=> Serialize(obj, DocTypeName, DocTypePubId, DocTypeSysId, DocTypeSysId);

View File

@@ -3,8 +3,7 @@ using SabreTools.Serialization.Interfaces;
namespace SabreTools.Serialization.Serializers
{
public partial class XMID :
IStringSerializer<Models.Xbox.XMID>
public partial class XMID : IStringSerializer<Models.Xbox.XMID>
{
#region IStringSerializer

View File

@@ -3,8 +3,7 @@ using SabreTools.Serialization.Interfaces;
namespace SabreTools.Serialization.Serializers
{
public partial class XeMID :
IStringSerializer<Models.Xbox.XeMID>
public partial class XeMID : IStringSerializer<Models.Xbox.XeMID>
{
#region IStringSerializer

View File

@@ -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
/// </summary>
/// <typeparam name="T"></typeparam>
public class XmlFile<T> :
IFileSerializer<T>,
IStreamSerializer<T>
public class XmlFile<T> : BaseBinarySerializer<T>
{
#region IByteSerializer
/// <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);
if (stream == null)
return null;
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
return bytes;
}
#endregion
#region IFileSerializer
/// <inheritdoc/>
public virtual bool Serialize(T? obj, string? path)
public override bool Serialize(T? obj, string? path)
=> Serialize(obj, path, null, null, null, null);
/// <summary>
@@ -49,12 +74,8 @@ namespace SabreTools.Serialization.Serializers
#region IStreamSerializer
/// <summary>
/// Serializes the defined type to a stream
/// </summary>
/// <param name="obj">Data to serialize</param>
/// <returns>Stream containing serialized data on success, null otherwise</returns>
public virtual Stream? Serialize(T? obj)
/// <inheritdoc/>
public override Stream? Serialize(T? obj)
=> Serialize(obj, null, null, null, null);
/// <summary>