diff --git a/SabreTools.Serialization/Internal.OfflineList.cs b/SabreTools.Serialization/Internal.OfflineList.cs
deleted file mode 100644
index 559b14ae..00000000
--- a/SabreTools.Serialization/Internal.OfflineList.cs
+++ /dev/null
@@ -1,220 +0,0 @@
-using System.Collections.Generic;
-using System.Linq;
-using SabreTools.Models.Internal;
-
-namespace SabreTools.Serialization
-{
- ///
- /// Serializer for OfflineList models to internal structure
- ///
- public partial class Internal
- {
- #region Serialize
-
- ///
- /// Convert from to
- ///
- public static MetadataFile ConvertToInternalModel(Models.OfflineList.Dat item)
- {
- var metadataFile = new MetadataFile
- {
- [MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
- };
-
- if (item?.Games?.Game != null && item.Games.Game.Any())
- metadataFile[MetadataFile.MachineKey] = item.Games.Game.Select(ConvertMachineToInternalModel).ToArray();
-
- return metadataFile;
- }
-
- ///
- /// Convert from to
- ///
- private static Header ConvertHeaderToInternalModel(Models.OfflineList.Dat item)
- {
- var header = new Header
- {
- [Header.SchemaLocationKey] = item.NoNamespaceSchemaLocation,
- };
-
- if (item.Configuration != null)
- {
- header[Header.NameKey] = item.Configuration.DatName;
- header[Header.ImFolderKey] = item.Configuration.ImFolder;
- header[Header.DatVersionKey] = item.Configuration.DatVersion;
- header[Header.SystemKey] = item.Configuration.System;
- header[Header.ScreenshotsWidthKey] = item.Configuration.ScreenshotsWidth;
- header[Header.ScreenshotsHeightKey] = item.Configuration.ScreenshotsHeight;
- header[Header.InfosKey] = item.Configuration.Infos;
- header[Header.CanOpenKey] = item.Configuration.CanOpen;
- header[Header.NewDatKey] = item.Configuration.NewDat;
- header[Header.SearchKey] = item.Configuration.Search;
- header[Header.RomTitleKey] = item.Configuration.RomTitle;
- }
-
- if (item.GUI != null)
- {
- header[Header.ImagesKey] = item.GUI.Images;
- }
-
- return header;
- }
-
- ///
- /// Convert from to
- ///
- private static Machine ConvertMachineToInternalModel(Models.OfflineList.Game item)
- {
- var machine = new Machine
- {
- [Machine.ImageNumberKey] = item.ImageNumber,
- [Machine.ReleaseNumberKey] = item.ReleaseNumber,
- [Machine.NameKey] = item.Title,
- [Machine.SaveTypeKey] = item.SaveType,
- [Machine.PublisherKey] = item.Publisher,
- [Machine.LocationKey] = item.Location,
- [Machine.SourceRomKey] = item.SourceRom,
- [Machine.LanguageKey] = item.Language,
- [Machine.Im1CRCKey] = item.Im1CRC,
- [Machine.Im2CRCKey] = item.Im2CRC,
- [Machine.CommentKey] = item.Comment,
- [Machine.DuplicateIDKey] = item.DuplicateID,
- };
-
- if (item.Files?.RomCRC != null && item.Files.RomCRC.Any())
- {
- var roms = new List();
- foreach (var file in item.Files.RomCRC)
- {
- var rom = ConvertToInternalModel(file);
- rom[Rom.SizeKey] = item.RomSize;
- roms.Add(rom);
- }
- machine[Machine.RomKey] = roms.ToArray();
- }
-
- return machine;
- }
-
- ///
- /// Convert from to
- ///
- private static Rom ConvertToInternalModel(Models.OfflineList.FileRomCRC item)
- {
- var rom = new Rom
- {
- [Rom.ExtensionKey] = item.Extension,
- [Rom.CRCKey] = item.Content,
- };
- return rom;
- }
-
- #endregion
-
- #region Deserialize
-
- ///
- /// Convert from to
- ///
- public static Models.OfflineList.Dat? ConvertHeaderToOfflineList(Header? item)
- {
- if (item == null)
- return null;
-
- var dat = new Models.OfflineList.Dat
- {
- NoNamespaceSchemaLocation = item.ReadString(Header.SchemaLocationKey),
- };
-
- if (item.ContainsKey(Header.NameKey)
- || item.ContainsKey(Header.ImFolderKey)
- || item.ContainsKey(Header.DatVersionKey)
- || item.ContainsKey(Header.SystemKey)
- || item.ContainsKey(Header.ScreenshotsWidthKey)
- || item.ContainsKey(Header.ScreenshotsHeightKey)
- || item.ContainsKey(Header.InfosKey)
- || item.ContainsKey(Header.CanOpenKey)
- || item.ContainsKey(Header.NewDatKey)
- || item.ContainsKey(Header.SearchKey)
- || item.ContainsKey(Header.RomTitleKey))
- {
- dat.Configuration = new Models.OfflineList.Configuration
- {
- DatName = item.ReadString(Header.NameKey),
- ImFolder = item.ReadString(Header.ImFolderKey),
- DatVersion = item.ReadString(Header.DatVersionKey),
- System = item.ReadString(Header.SystemKey),
- ScreenshotsWidth = item.ReadString(Header.ScreenshotsWidthKey),
- ScreenshotsHeight = item.ReadString(Header.ScreenshotsHeightKey),
- Infos = item.Read(Header.InfosKey),
- CanOpen = item.Read(Header.CanOpenKey),
- NewDat = item.Read(Header.NewDatKey),
- Search = item.Read(Header.SearchKey),
- RomTitle = item.ReadString(Header.RomTitleKey),
- };
- }
-
- if (item.ContainsKey(Header.ImagesKey))
- {
- dat.GUI = new Models.OfflineList.GUI
- {
- Images = item.Read(Header.ImagesKey),
- };
- }
-
- return dat;
- }
-
- ///
- /// Convert from to
- ///
- public static Models.OfflineList.Game? ConvertMachineToOfflineList(Machine? item)
- {
- if (item == null)
- return null;
-
- var game = new Models.OfflineList.Game
- {
- ImageNumber = item.ReadString(Machine.ImageNumberKey),
- ReleaseNumber = item.ReadString(Machine.ReleaseNumberKey),
- Title = item.ReadString(Machine.NameKey),
- SaveType = item.ReadString(Machine.SaveTypeKey),
- Publisher = item.ReadString(Machine.PublisherKey),
- Location = item.ReadString(Machine.LocationKey),
- SourceRom = item.ReadString(Machine.SourceRomKey),
- Language = item.ReadString(Machine.LanguageKey),
- Im1CRC = item.ReadString(Machine.Im1CRCKey),
- Im2CRC = item.ReadString(Machine.Im2CRCKey),
- Comment = item.ReadString(Machine.CommentKey),
- DuplicateID = item.ReadString(Machine.DuplicateIDKey),
- };
-
- var roms = item.Read(Machine.RomKey);
- game.RomSize = roms?
- .Select(rom => rom.ReadString(Rom.SizeKey))?
- .FirstOrDefault(s => s != null);
- var romCRCs = roms?.Select(ConvertToOfflineList).ToArray();
- game.Files = new Models.OfflineList.Files { RomCRC = romCRCs };
-
- return game;
- }
-
- ///
- /// Convert from to
- ///
- private static Models.OfflineList.FileRomCRC? ConvertToOfflineList(Rom? item)
- {
- if (item == null)
- return null;
-
- var fileRomCRC = new Models.OfflineList.FileRomCRC
- {
- Extension = item.ReadString(Rom.ExtensionKey),
- Content = item.ReadString(Rom.CRCKey),
- };
- return fileRomCRC;
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/SabreTools.Serialization/OfflineList.Deserializer.cs b/SabreTools.Serialization/OfflineList.Deserializer.cs
new file mode 100644
index 00000000..3e29c4ef
--- /dev/null
+++ b/SabreTools.Serialization/OfflineList.Deserializer.cs
@@ -0,0 +1,118 @@
+using System.Linq;
+using SabreTools.Models.OfflineList;
+
+namespace SabreTools.Serialization
+{
+ ///
+ /// XML deserializer for OfflineList metadata files
+ ///
+ public partial class OfflineList : XmlSerializer
+ {
+ // TODO: Add deserialization of entire Dat
+ #region Internal
+
+ ///
+ /// Convert from to
+ ///
+ public static Dat? ConvertHeaderFromInternalModel(Models.Internal.Header? item)
+ {
+ if (item == null)
+ return null;
+
+ var dat = new Dat
+ {
+ NoNamespaceSchemaLocation = item.ReadString(Models.Internal.Header.SchemaLocationKey),
+ };
+
+ if (item.ContainsKey(Models.Internal.Header.NameKey)
+ || item.ContainsKey(Models.Internal.Header.ImFolderKey)
+ || item.ContainsKey(Models.Internal.Header.DatVersionKey)
+ || item.ContainsKey(Models.Internal.Header.SystemKey)
+ || item.ContainsKey(Models.Internal.Header.ScreenshotsWidthKey)
+ || item.ContainsKey(Models.Internal.Header.ScreenshotsHeightKey)
+ || item.ContainsKey(Models.Internal.Header.InfosKey)
+ || item.ContainsKey(Models.Internal.Header.CanOpenKey)
+ || item.ContainsKey(Models.Internal.Header.NewDatKey)
+ || item.ContainsKey(Models.Internal.Header.SearchKey)
+ || item.ContainsKey(Models.Internal.Header.RomTitleKey))
+ {
+ dat.Configuration = new Configuration
+ {
+ DatName = item.ReadString(Models.Internal.Header.NameKey),
+ ImFolder = item.ReadString(Models.Internal.Header.ImFolderKey),
+ DatVersion = item.ReadString(Models.Internal.Header.DatVersionKey),
+ System = item.ReadString(Models.Internal.Header.SystemKey),
+ ScreenshotsWidth = item.ReadString(Models.Internal.Header.ScreenshotsWidthKey),
+ ScreenshotsHeight = item.ReadString(Models.Internal.Header.ScreenshotsHeightKey),
+ Infos = item.Read(Models.Internal.Header.InfosKey),
+ CanOpen = item.Read(Models.Internal.Header.CanOpenKey),
+ NewDat = item.Read(Models.Internal.Header.NewDatKey),
+ Search = item.Read(Models.Internal.Header.SearchKey),
+ RomTitle = item.ReadString(Models.Internal.Header.RomTitleKey),
+ };
+ }
+
+ if (item.ContainsKey(Models.Internal.Header.ImagesKey))
+ {
+ dat.GUI = new GUI
+ {
+ Images = item.Read(Models.Internal.Header.ImagesKey),
+ };
+ }
+
+ return dat;
+ }
+
+ ///
+ /// Convert from to
+ ///
+ public static Game? ConvertMachineFromInternalModel(Models.Internal.Machine? item)
+ {
+ if (item == null)
+ return null;
+
+ var game = new Game
+ {
+ ImageNumber = item.ReadString(Models.Internal.Machine.ImageNumberKey),
+ ReleaseNumber = item.ReadString(Models.Internal.Machine.ReleaseNumberKey),
+ Title = item.ReadString(Models.Internal.Machine.NameKey),
+ SaveType = item.ReadString(Models.Internal.Machine.SaveTypeKey),
+ Publisher = item.ReadString(Models.Internal.Machine.PublisherKey),
+ Location = item.ReadString(Models.Internal.Machine.LocationKey),
+ SourceRom = item.ReadString(Models.Internal.Machine.SourceRomKey),
+ Language = item.ReadString(Models.Internal.Machine.LanguageKey),
+ Im1CRC = item.ReadString(Models.Internal.Machine.Im1CRCKey),
+ Im2CRC = item.ReadString(Models.Internal.Machine.Im2CRCKey),
+ Comment = item.ReadString(Models.Internal.Machine.CommentKey),
+ DuplicateID = item.ReadString(Models.Internal.Machine.DuplicateIDKey),
+ };
+
+ var roms = item.Read(Models.Internal.Machine.RomKey);
+ game.RomSize = roms?
+ .Select(rom => rom.ReadString(Models.Internal.Rom.SizeKey))?
+ .FirstOrDefault(s => s != null);
+ var romCRCs = roms?.Select(ConvertFromInternalModel).ToArray();
+ game.Files = new Files { RomCRC = romCRCs };
+
+ return game;
+ }
+
+ ///
+ /// Convert from to
+ ///
+ private static FileRomCRC? ConvertFromInternalModel(Models.Internal.Rom? item)
+ {
+ if (item == null)
+ return null;
+
+ var fileRomCRC = new FileRomCRC
+ {
+ Extension = item.ReadString(Models.Internal.Rom.ExtensionKey),
+ Content = item.ReadString(Models.Internal.Rom.CRCKey),
+ };
+ return fileRomCRC;
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Serialization/OfflineList.Serializer.cs b/SabreTools.Serialization/OfflineList.Serializer.cs
new file mode 100644
index 00000000..563b2851
--- /dev/null
+++ b/SabreTools.Serialization/OfflineList.Serializer.cs
@@ -0,0 +1,111 @@
+using System.Linq;
+using SabreTools.Models.OfflineList;
+
+namespace SabreTools.Serialization
+{
+ ///
+ /// XML serializer for OfflineList metadata files
+ ///
+ public partial class OfflineList : XmlSerializer
+ {
+ #region Internal
+
+ ///
+ /// Convert from to
+ ///
+ public static Models.Internal.MetadataFile ConvertToInternalModel(Dat item)
+ {
+ var metadataFile = new Models.Internal.MetadataFile
+ {
+ [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
+ };
+
+ if (item?.Games?.Game != null && item.Games.Game.Any())
+ metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Games.Game.Select(ConvertMachineToInternalModel).ToArray();
+
+ return metadataFile;
+ }
+
+ ///
+ /// Convert from to
+ ///
+ private static Models.Internal.Header ConvertHeaderToInternalModel(Dat item)
+ {
+ var header = new Models.Internal.Header
+ {
+ [Models.Internal.Header.SchemaLocationKey] = item.NoNamespaceSchemaLocation,
+ };
+
+ if (item.Configuration != null)
+ {
+ header[Models.Internal.Header.NameKey] = item.Configuration.DatName;
+ header[Models.Internal.Header.ImFolderKey] = item.Configuration.ImFolder;
+ header[Models.Internal.Header.DatVersionKey] = item.Configuration.DatVersion;
+ header[Models.Internal.Header.SystemKey] = item.Configuration.System;
+ header[Models.Internal.Header.ScreenshotsWidthKey] = item.Configuration.ScreenshotsWidth;
+ header[Models.Internal.Header.ScreenshotsHeightKey] = item.Configuration.ScreenshotsHeight;
+ header[Models.Internal.Header.InfosKey] = item.Configuration.Infos;
+ header[Models.Internal.Header.CanOpenKey] = item.Configuration.CanOpen;
+ header[Models.Internal.Header.NewDatKey] = item.Configuration.NewDat;
+ header[Models.Internal.Header.SearchKey] = item.Configuration.Search;
+ header[Models.Internal.Header.RomTitleKey] = item.Configuration.RomTitle;
+ }
+
+ if (item.GUI != null)
+ {
+ header[Models.Internal.Header.ImagesKey] = item.GUI.Images;
+ }
+
+ return header;
+ }
+
+ ///
+ /// Convert from to
+ ///
+ private static Models.Internal.Machine ConvertMachineToInternalModel(Game item)
+ {
+ var machine = new Models.Internal.Machine
+ {
+ [Models.Internal.Machine.ImageNumberKey] = item.ImageNumber,
+ [Models.Internal.Machine.ReleaseNumberKey] = item.ReleaseNumber,
+ [Models.Internal.Machine.NameKey] = item.Title,
+ [Models.Internal.Machine.SaveTypeKey] = item.SaveType,
+ [Models.Internal.Machine.PublisherKey] = item.Publisher,
+ [Models.Internal.Machine.LocationKey] = item.Location,
+ [Models.Internal.Machine.SourceRomKey] = item.SourceRom,
+ [Models.Internal.Machine.LanguageKey] = item.Language,
+ [Models.Internal.Machine.Im1CRCKey] = item.Im1CRC,
+ [Models.Internal.Machine.Im2CRCKey] = item.Im2CRC,
+ [Models.Internal.Machine.CommentKey] = item.Comment,
+ [Models.Internal.Machine.DuplicateIDKey] = item.DuplicateID,
+ };
+
+ if (item.Files?.RomCRC != null && item.Files.RomCRC.Any())
+ {
+ machine[Models.Internal.Machine.RomKey] = item.Files.RomCRC.Select(romCRC =>
+ {
+ var rom = ConvertToInternalModel(romCRC);
+ rom[Models.Internal.Rom.SizeKey] = item.RomSize;
+ return rom;
+ }).ToArray();
+ }
+
+ return machine;
+ }
+
+ ///
+ /// Convert from to
+ ///
+ private static Models.Internal.Rom ConvertToInternalModel(FileRomCRC item)
+ {
+ var rom = new Models.Internal.Rom
+ {
+ [Models.Internal.Rom.ExtensionKey] = item.Extension,
+ [Models.Internal.Rom.CRCKey] = item.Content,
+ };
+ return rom;
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Serialization/OfflineList.cs b/SabreTools.Serialization/OfflineList.cs
deleted file mode 100644
index 9a43e961..00000000
--- a/SabreTools.Serialization/OfflineList.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace SabreTools.Serialization
-{
- ///
- /// XML deserializer for OfflineList metadata files
- ///
- public class OfflineList : XmlSerializer { }
-}
\ No newline at end of file