If you have HDF5 support, that is a good way to save checkpoint data.
hdf5 = HDF5File(mesh.mpi_comm(), "a.h5", "w")
hdf5.write(mesh, "mesh")
hdf5.write(u, "potential_field")
You can reload with
hdf5 = HDF5File(mesh.mpi_comm(), "a.h5", "r")
mesh = Mesh()
hdf5.read(mesh, "mesh")
Q = FunctionSpace(mesh, "CG", 3) # or whatever it is
u = Function(Q)
hdf5.read(u, "potential_field")
or similar. There is also support for time series in HDF5 though it is not well documented yet.