mirror of
https://github.com/claunia/SabreTools.git
synced 2025-12-16 19:14:27 +00:00
Start populating serializer framework
This commit is contained in:
7
SabreTools.Serialization/ArchiveDotOrg.cs
Normal file
7
SabreTools.Serialization/ArchiveDotOrg.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace SabreTools.Serialization
|
||||
{
|
||||
/// <summary>
|
||||
/// XML deserializer for archive.org metadata files
|
||||
/// </summary>
|
||||
public class ArchiveDotOrg : Serializer<Models.ArchiveDotOrg.Files> { }
|
||||
}
|
||||
7
SabreTools.Serialization/Listxml.cs
Normal file
7
SabreTools.Serialization/Listxml.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace SabreTools.Serialization
|
||||
{
|
||||
/// <summary>
|
||||
/// XML deserializer for MAME listxml files
|
||||
/// </summary>
|
||||
public class Listxml : Serializer<Models.Listxml.Mame> { }
|
||||
}
|
||||
7
SabreTools.Serialization/OfflineList.cs
Normal file
7
SabreTools.Serialization/OfflineList.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace SabreTools.Serialization
|
||||
{
|
||||
/// <summary>
|
||||
/// XML deserializer for OfflineList metadata files
|
||||
/// </summary>
|
||||
public class OfflineList : Serializer<Models.OfflineList.Dat> { }
|
||||
}
|
||||
7
SabreTools.Serialization/OpenMSX.cs
Normal file
7
SabreTools.Serialization/OpenMSX.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace SabreTools.Serialization
|
||||
{
|
||||
/// <summary>
|
||||
/// XML deserializer for OpenMSX software database files
|
||||
/// </summary>
|
||||
public class OpenMSX : Serializer<Models.OpenMSX.SoftwareDb> { }
|
||||
}
|
||||
50
SabreTools.Serialization/PathProcessor.cs
Normal file
50
SabreTools.Serialization/PathProcessor.cs
Normal file
@@ -0,0 +1,50 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
|
||||
namespace SabreTools.Serialization
|
||||
{
|
||||
internal class PathProcessor
|
||||
{
|
||||
/// <summary>
|
||||
/// Opens a path as a stream in a safe manner, decompressing if needed
|
||||
/// </summary>
|
||||
/// <param name="path">Path to open as a stream</param>
|
||||
/// <returns>Stream representing the file, null on error</returns>
|
||||
public static Stream? OpenStream(string path)
|
||||
{
|
||||
try
|
||||
{
|
||||
// If we don't have a file
|
||||
if (string.IsNullOrWhiteSpace(path) || !File.Exists(path))
|
||||
return null;
|
||||
|
||||
// Open the file for deserialization
|
||||
var stream = File.OpenRead(path);
|
||||
|
||||
// Get the extension to determine if additional handling is needed
|
||||
string ext = Path.GetExtension(path).TrimStart('.');
|
||||
|
||||
// Determine what we do based on the extension
|
||||
if (string.Equals(ext, "gz", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return new GZipStream(stream, CompressionMode.Decompress);
|
||||
}
|
||||
else if (string.Equals(ext, "zip", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
// TODO: Support zip-compressed files
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
return stream;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// TODO: Handle logging the exception
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
64
SabreTools.Serialization/Serializer.cs
Normal file
64
SabreTools.Serialization/Serializer.cs
Normal file
@@ -0,0 +1,64 @@
|
||||
using System.IO;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace SabreTools.Serialization
|
||||
{
|
||||
/// <summary>
|
||||
/// XML deserializer for nullable types
|
||||
/// </summary>
|
||||
public abstract class Serializer<T>
|
||||
{
|
||||
/// <summary>
|
||||
/// Deserializes an XML file to the defined type
|
||||
/// </summary>
|
||||
/// <param name="path">Path to the file to deserialize</param>
|
||||
/// <returns>Deserialized data on success, null on failure</returns>
|
||||
public static T? Deserialize(string path)
|
||||
{
|
||||
try
|
||||
{
|
||||
using var stream = PathProcessor.OpenStream(path);
|
||||
return Deserialize(stream);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// TODO: Handle logging the exception
|
||||
return default;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deserializes an XML file in a stream to the defined type
|
||||
/// </summary>
|
||||
/// <param name="stream">Stream to deserialize</param>
|
||||
/// <returns>Deserialized data on success, null on failure</returns>
|
||||
public static T? Deserialize(Stream? stream)
|
||||
{
|
||||
try
|
||||
{
|
||||
// If the stream is null
|
||||
if (stream == null)
|
||||
return default;
|
||||
|
||||
// Setup the serializer and the reader
|
||||
var serializer = new XmlSerializer(typeof(T));
|
||||
var settings = new XmlReaderSettings
|
||||
{
|
||||
CheckCharacters = false,
|
||||
DtdProcessing = DtdProcessing.Ignore,
|
||||
};
|
||||
var streamReader = new StreamReader(stream);
|
||||
var xmlReader = XmlReader.Create(streamReader, settings);
|
||||
|
||||
// Perform the deserialization and return
|
||||
return (T?)serializer.Deserialize(xmlReader);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// TODO: Handle logging the exception
|
||||
return default;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
7
SabreTools.Serialization/SoftwareList.cs
Normal file
7
SabreTools.Serialization/SoftwareList.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace SabreTools.Serialization
|
||||
{
|
||||
/// <summary>
|
||||
/// XML deserializer for MAME softwarelist files
|
||||
/// </summary>
|
||||
public class SoftawreList : Serializer<Models.SoftwareList.SoftwareList> { }
|
||||
}
|
||||
@@ -11,17 +11,12 @@ namespace SabreTools.Test.Parser
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = System.IO.Path.Combine(Environment.CurrentDirectory, "TestData", "test-archivedotorg-files.xml");
|
||||
using var fs = System.IO.File.OpenRead(filename);
|
||||
|
||||
// Setup the serializer
|
||||
var serializer = new XmlSerializer(typeof(Models.ArchiveDotOrg.Files));
|
||||
|
||||
// Deserialize the file
|
||||
var dat = serializer.Deserialize(fs) as Models.ArchiveDotOrg.Files;
|
||||
var dat = Serialization.ArchiveDotOrg.Deserialize(filename);
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(dat);
|
||||
Assert.NotNull(dat.File);
|
||||
Assert.NotNull(dat?.File);
|
||||
Assert.Equal(22, dat.File.Length);
|
||||
|
||||
// Validate we're not missing any attributes or elements
|
||||
@@ -39,19 +34,12 @@ namespace SabreTools.Test.Parser
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = System.IO.Path.Combine(Environment.CurrentDirectory, "TestData", "test-listxml-files.xml.gz");
|
||||
using var fs = System.IO.File.OpenRead(filename);
|
||||
using var gz = new System.IO.Compression.GZipStream(fs, System.IO.Compression.CompressionMode.Decompress);
|
||||
using var xr = System.Xml.XmlReader.Create(gz, new System.Xml.XmlReaderSettings { DtdProcessing = System.Xml.DtdProcessing.Ignore });
|
||||
|
||||
// Setup the serializer
|
||||
var serializer = new XmlSerializer(typeof(Models.Listxml.Mame));
|
||||
|
||||
// Deserialize the file
|
||||
var dat = serializer.Deserialize(xr) as Models.Listxml.Mame;
|
||||
var dat = Serialization.Listxml.Deserialize(filename);
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(dat);
|
||||
Assert.NotNull(dat.Machine);
|
||||
Assert.NotNull(dat?.Machine);
|
||||
Assert.Equal(45861, dat.Machine.Length);
|
||||
|
||||
// Validate we're not missing any attributes or elements
|
||||
@@ -267,19 +255,12 @@ namespace SabreTools.Test.Parser
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = System.IO.Path.Combine(Environment.CurrentDirectory, "TestData", "test-offlinelist-files.xml");
|
||||
using var fs = System.IO.File.OpenRead(filename);
|
||||
using var xr = System.Xml.XmlReader.Create(fs, new System.Xml.XmlReaderSettings { DtdProcessing = System.Xml.DtdProcessing.Ignore });
|
||||
|
||||
// Setup the serializer
|
||||
var serializer = new XmlSerializer(typeof(Models.OfflineList.Dat));
|
||||
|
||||
// Deserialize the file
|
||||
var dat = serializer.Deserialize(xr) as Models.OfflineList.Dat;
|
||||
var dat = Serialization.OfflineList.Deserialize(filename);
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(dat);
|
||||
Assert.NotNull(dat.Games);
|
||||
Assert.NotNull(dat.Games.Game);
|
||||
Assert.NotNull(dat?.Games?.Game);
|
||||
Assert.Equal(6750, dat.Games.Game.Length);
|
||||
|
||||
// Validate we're not missing any attributes or elements
|
||||
@@ -478,14 +459,9 @@ namespace SabreTools.Test.Parser
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = System.IO.Path.Combine(Environment.CurrentDirectory, "TestData", "test-openmsx-files.xml");
|
||||
using var fs = System.IO.File.OpenRead(filename);
|
||||
using var xr = System.Xml.XmlReader.Create(fs, new System.Xml.XmlReaderSettings { DtdProcessing = System.Xml.DtdProcessing.Ignore });
|
||||
|
||||
// Setup the serializer
|
||||
var serializer = new XmlSerializer(typeof(Models.OpenMSX.SoftwareDb));
|
||||
|
||||
// Deserialize the file
|
||||
var dat = serializer.Deserialize(xr) as Models.OpenMSX.SoftwareDb;
|
||||
var dat = Serialization.OpenMSX.Deserialize(filename);
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(dat);
|
||||
@@ -537,14 +513,9 @@ namespace SabreTools.Test.Parser
|
||||
{
|
||||
// Open the file for reading
|
||||
string filename = System.IO.Path.Combine(Environment.CurrentDirectory, "TestData", "test-softwarelist-files.xml");
|
||||
using var fs = System.IO.File.OpenRead(filename);
|
||||
using var xr = System.Xml.XmlReader.Create(fs, new System.Xml.XmlReaderSettings { DtdProcessing = System.Xml.DtdProcessing.Ignore });
|
||||
|
||||
// Setup the serializer
|
||||
var serializer = new XmlSerializer(typeof(Models.SoftwareList.SoftwareList));
|
||||
|
||||
// Deserialize the file
|
||||
var dat = serializer.Deserialize(xr) as Models.SoftwareList.SoftwareList;
|
||||
var dat = Serialization.SoftawreList.Deserialize(filename);
|
||||
|
||||
// Validate the values
|
||||
Assert.NotNull(dat);
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
<ProjectReference Include="..\SabreTools.Filtering\SabreTools.Filtering.csproj" />
|
||||
<ProjectReference Include="..\SabreTools.IO\SabreTools.IO.csproj" />
|
||||
<ProjectReference Include="..\SabreTools.Models\SabreTools.Models.csproj" />
|
||||
<ProjectReference Include="..\SabreTools.Serialization\SabreTools.Serialization.csproj" />
|
||||
<ProjectReference Include="..\SabreTools.Skippers\SabreTools.Skippers.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user