The TBufDataSet can persist state, for example if the connection to the underlying data base is lost.
It has its own (file and stream) storage format as well as the format of the underlying TDataset.
Which is why I consider it middleware...
I even mis-use it as a flat file database when something simple like an address book is required.
If that address book is later needed in a proper database I only have to connect it with another TDataset....
See the point?
I believe I gave an example two years ago on this forum.
But if you mean full object persistence look at tiOPF and mORMmot. Both are excellent.
But in the strictest sense you asked for middleware, not object persistence. TBufDataset is middleware with some properties of persistence and abstraction.
Even m/v separation

btw: TBufDataset can also be used server-side... for some extra enlightenment. I have never seen it - apart from my own experiments - but it works great in some scenario's.