I think each adapter needs to know how to generate its own hash `data` for when to_hash is called on the adapter. When an adapter uses sub-serializers, it can either do as proposed above by calling to_hash on the sub-serialize (really the sub-adapter) before it places the sub-hash in `data` or it can traverse all the `data` locations that it knows it put sub-serializes in as part of its (the adapter's) to_hash.

If the serializer object is responsible for calling to_hash not only on the adapter object, but also everything inside the hash the adapter object returns, it is going to have to do a deep search, because the adapters don't always place the sub-serialized data in a top level key. The adapter could have placed the sub-data however deep in the `data` object that it likes.

So, either way, either the adapter will need to call to_hash on the sub-data before it adds it to `data`, or the adapter's to_hash method will have to call to_hash in all the (possibly deep) locations in which the adapter places the sub-data.