diff --git a/serialize.hpp b/serialize.hpp
index e0fc89a..e724919 100644
--- a/serialize.hpp
+++ b/serialize.hpp
@@ -7,74 +7,85 @@
 #include <fstream>
 #include <phosphor-logging/log.hpp>
 
-namespace cereal
+namespace phosphor
+{
+namespace inventory
+{
+namespace manager
 {
 
 namespace fs = std::experimental::filesystem;
 
-using Path = std::string;
-using Interface = std::string;
-using namespace phosphor::logging;
-
-/** @brief Serialize inventory item
- *
- *  @param[in] path - DBus object path
- *  @param[in] iface - Inventory interface name
- *  @param[in] object - Object to be serialized
- */
-template <typename T>
-inline void serialize(const Path& path, const Interface& iface, const T& object)
+struct SerialOps
 {
-    fs::path p(PIM_PERSIST_PATH);
-    p /= path;
-    fs::create_directories(p);
-    p /= iface;
-    std::ofstream os(p, std::ios::binary);
-    cereal::JSONOutputArchive oarchive(os);
-    oarchive(object);
-}
-
-/** @brief Serialize inventory item path
- *  Serializing only path for an empty interface to be consistent
- *  interfaces.
- *  @param[in] path - DBus object path
- *  @param[in] iface - Inventory interface name
- */
-inline void serialize(const Path& path, const Interface& iface)
-{
-    fs::path p(PIM_PERSIST_PATH);
-    p /= path;
-    fs::create_directories(p);
-    p /= iface;
-    std::ofstream os(p, std::ios::binary);
-}
-
-/** @brief Deserialize inventory item
- *
- *  @param[in] path - DBus object path
- *  @param[in] iface - Inventory interface name
- *  @param[in] object - Object to be serialized
- */
-template <typename T>
-inline void deserialize(const Path& path, const Interface& iface, T& object)
-{
-    fs::path p(PIM_PERSIST_PATH);
-    p /= path;
-    p /= iface;
-    try
+    /** @brief Serialize inventory item path
+     *  Serializing only path for an empty interface to be consistent
+     *  interfaces.
+     *  @param[in] path - DBus object path
+     *  @param[in] iface - Inventory interface name
+     */
+    static void serialize(const std::string& path, const std::string& iface)
     {
-        if (fs::exists(p))
+        fs::path p(PIM_PERSIST_PATH);
+        p /= path;
+        fs::create_directories(p);
+        p /= iface;
+        std::ofstream os(p, std::ios::binary);
+    }
+
+    /** @brief Serialize inventory item
+     *
+     *  @param[in] path - DBus object path
+     *  @param[in] iface - Inventory interface name
+     *  @param[in] object - Object to be serialized
+     */
+    template <typename T>
+    static void serialize(const std::string& path, const std::string& iface,
+                          const T& object)
+    {
+        fs::path p(PIM_PERSIST_PATH);
+        p /= path;
+        fs::create_directories(p);
+        p /= iface;
+        std::ofstream os(p, std::ios::binary);
+        cereal::JSONOutputArchive oarchive(os);
+        oarchive(object);
+    }
+
+    static void deserialize(const std::string&, const std::string&)
+    {
+        // This is intentionally a noop.
+    }
+
+    /** @brief Deserialize inventory item
+     *
+     *  @param[in] path - DBus object path
+     *  @param[in] iface - Inventory interface name
+     *  @param[in] object - Object to be serialized
+     */
+    template <typename T>
+    static void deserialize(const std::string& path, const std::string& iface,
+                            T& object)
+    {
+        fs::path p(PIM_PERSIST_PATH);
+        p /= path;
+        p /= iface;
+        try
         {
-            std::ifstream is(p, std::ios::in | std::ios::binary);
-            cereal::JSONInputArchive iarchive(is);
-            iarchive(object);
+            if (fs::exists(p))
+            {
+                std::ifstream is(p, std::ios::in | std::ios::binary);
+                cereal::JSONInputArchive iarchive(is);
+                iarchive(object);
+            }
+        }
+        catch (cereal::Exception& e)
+        {
+            phosphor::logging::log<phosphor::logging::level::ERR>(e.what());
+            fs::remove(p);
         }
     }
-    catch (cereal::Exception& e)
-    {
-        log<level::ERR>(e.what());
-        fs::remove(p);
-    }
-}
-
-} // namespace cereal
+};
+} // namespace manager
+} // namespace inventory
+} // namespace phosphor
