I frequently work on binary data files that contain data structures
with nested tagged unions: sf2, mp3, smf, CAN, J1939.  I can parse the
files ad-hoc and look at data bytes to instantiate the correct final
object but it seems there should be a better classy way where the
parsing occurs hierarchically as the inheriting classes become more
specialized.

Say a file contains a collection of shapes.  As you read bytes you
discover the shapes are squares and triangles, but you don't know that
until you've read some of the data that resides in the shape
superclass, so then you have to pass that data in when you instantiate
the new square object which is then used to assign to instance
variables of the superclass.    It would be nicer to be able to
instantiate a generic superclass object, read its data, then based on
the values of the tags specialize the object to become a square or
triangular object and then the specialized object can read its data to
become more specific, and so on.  Each child class could parse the bits
it knows about, and the object becomes more specialized as it reads
more.
In CLOS there are ways around this such as described in Peter Seibel's
book.

Does anyone know of any Ruby techniques that work well when reading
data containing tagged unions?

Thanks!  Bob