diff --git a/src/manager_serialize.cpp b/src/manager_serialize.cpp
new file mode 100644
index 0000000..ef7b1b4
--- /dev/null
+++ b/src/manager_serialize.cpp
@@ -0,0 +1,92 @@
+#include "manager_serialize.hpp"
+
+#include <cereal/archives/binary.hpp>
+#include <cereal/cereal.hpp>
+#include <cereal/types/map.hpp>
+#include <cereal/types/string.hpp>
+#include <cereal/types/tuple.hpp>
+#include <cereal/types/variant.hpp>
+#include <cereal/types/vector.hpp>
+#include <phosphor-logging/log.hpp>
+
+#include <fstream>
+
+namespace bios_config
+{
+
+using namespace phosphor::logging;
+
+/** @brief Function required by Cereal to perform serialization.
+ *
+ *  @tparam Archive - Cereal archive type (binary in this case).
+ *  @param[in] archive - reference to cereal archive.
+ *  @param[in] entry- const reference to bios manager object
+ *  @param[in] version - Class version that enables handling a serialized data
+ *                       across code levels
+ */
+template <class Archive>
+void save(Archive& archive, const Manager& entry,
+          const std::uint32_t /*version*/)
+{
+    archive(entry.sdbusplus::xyz::openbmc_project::BIOSConfig::server::Manager::
+                baseBIOSTable(),
+            entry.sdbusplus::xyz::openbmc_project::BIOSConfig::server::Manager::
+                pendingAttributes());
+}
+
+/** @brief Function required by Cereal to perform deserialization.
+ *
+ *  @tparam Archive - Cereal archive type (binary in our case).
+ *  @param[in] archive - reference to cereal archive.
+ *  @param[out] entry - reference to bios manager object
+ *  @param[in] version - Class version that enables handling a serialized data
+ *                       across code levels
+ */
+template <class Archive>
+void load(Archive& archive, Manager& entry, const std::uint32_t /*version*/)
+{
+    Manager::BaseTable baseTable;
+    Manager::PendingAttributes pendingAttrs;
+
+    archive(baseTable, pendingAttrs);
+    entry.sdbusplus::xyz::openbmc_project::BIOSConfig::server::Manager::
+        baseBIOSTable(baseTable, true);
+    entry.sdbusplus::xyz::openbmc_project::BIOSConfig::server::Manager::
+        pendingAttributes(pendingAttrs, true);
+}
+
+void serialize(const Manager& obj, const fs::path& path)
+{
+    std::ofstream os(path.c_str(), std::ios::out | std::ios::binary);
+    cereal::BinaryOutputArchive oarchive(os);
+    oarchive(obj);
+}
+
+bool deserialize(const fs::path& path, Manager& entry)
+{
+    try
+    {
+        if (fs::exists(path))
+        {
+            std::ifstream is(path.c_str(), std::ios::in | std::ios::binary);
+            cereal::BinaryInputArchive iarchive(is);
+            iarchive(entry);
+            return true;
+        }
+        return false;
+    }
+    catch (cereal::Exception& e)
+    {
+        log<level::ERR>(e.what());
+        fs::remove(path);
+        return false;
+    }
+    catch (const std::length_error& e)
+    {
+        log<level::ERR>(e.what());
+        fs::remove(path);
+        return false;
+    }
+}
+
+} // namespace bios_config
\ No newline at end of file
