diff --git a/IByteSerializer.cs b/IByteSerializer.cs
new file mode 100644
index 00000000..b4afc3b7
--- /dev/null
+++ b/IByteSerializer.cs
@@ -0,0 +1,21 @@
+namespace SabreTools.Serialization
+{
+ ///
+ /// Defines how to serialize to and from byte arrays
+ ///
+ public interface IByteSerializer
+ {
+ ///
+ /// Deserialize a byte array into
+ ///
+ /// Type of object to deserialize to
+ /// Byte array to parse
+ /// Offset into the byte array
+ /// Filled object on success, null on error
+#if NET48
+ T Deserialize(byte[] data, int offset);
+#else
+ T? Deserialize(byte[]? data, int offset);
+#endif
+ }
+}
\ No newline at end of file
diff --git a/IFileSerializer.cs b/IFileSerializer.cs
new file mode 100644
index 00000000..7efa7913
--- /dev/null
+++ b/IFileSerializer.cs
@@ -0,0 +1,20 @@
+namespace SabreTools.Serialization
+{
+ ///
+ /// Defines how to serialize to and from files
+ ///
+ public interface IFileSerializer
+ {
+ ///
+ /// Deserialize a file into
+ ///
+ /// Type of object to deserialize to
+ /// Path to deserialize from
+ /// Filled object on success, null on error
+#if NET48
+ T Deserialize(string path);
+#else
+ T? Deserialize(string? path);
+#endif
+ }
+}
\ No newline at end of file
diff --git a/IModelSerializer.cs b/IModelSerializer.cs
new file mode 100644
index 00000000..0e902316
--- /dev/null
+++ b/IModelSerializer.cs
@@ -0,0 +1,21 @@
+namespace SabreTools.Serialization
+{
+ ///
+ /// Defines how to serialize to and from files
+ ///
+ public interface IFileSerializer
+ {
+ ///
+ /// Deserialize a into
+ ///
+ /// Type of object to deserialize from
+ /// Type of object to deserialize to
+ /// Object to deserialize from
+ /// Filled object on success, null on error
+#if NET48
+ U Deserialize(T obj);
+#else
+ U? Deserialize(T? obj);
+#endif
+ }
+}
\ No newline at end of file
diff --git a/IStreamSerializer.cs b/IStreamSerializer.cs
new file mode 100644
index 00000000..d6cfeb8f
--- /dev/null
+++ b/IStreamSerializer.cs
@@ -0,0 +1,22 @@
+using System.IO;
+
+namespace SabreTools.Serialization
+{
+ ///
+ /// Defines how to serialize to and from Streams
+ ///
+ public interface IStreamSerializer
+ {
+ ///
+ /// Deserialize a Stream into
+ ///
+ /// Type of object to deserialize to
+ /// Stream to parse
+ /// Filled object on success, null on error
+#if NET48
+ T Deserialize(Stream data);
+#else
+ T? Deserialize(Stream? data);
+#endif
+ }
+}
\ No newline at end of file