I do think maybe that it assumes to much about the data structure that will be constructed in the adapters.

Keep in mind that not self-initializing the sub hashes pretty much rules out #19 from happening. This would mean possibly Adapter#to_hash or Serializer#to_hash will have to do a recursive deep search to call to_hash on sub serializers if the change is made to Adapter#serializer_from_block_or_class to return serializers and if you still don't want #to_hash being called on these from within the adapter methods.