Files carry their schema in a header or footer; a Kafka 129 message cannot afford to. A schema registry stores each version once under a subject and gives it an ID. In Confluent 17,245 's wire format, also used with Karapace 637 and Apicurio's Confluent-compatible API, a message is a zero magic byte, a 4-byte big-endian schema ID and the body: framing order 1 under ID 42 (demos/ch03/avro/frame.py) gave 47 bytes, 00 00 00 00 2a and the 42-byte body.
The registry also rejects an incompatible version at registration. BACKWARD, the default, checks the new schema against the latest one so new consumers read old data (upgrade consumers first); FORWARD is the reverse (producers first), FULL is both, _TRANSITIVE variants check every earlier version, and NONE nothing. Confluent recommends BACKWARD_TRANSITIVE for Protobuf. Parquet 129 has no registry; table formats fill that role (Lakehouse Tables). Schema Registry runs Confluent Schema Registry and Apicurio Registry against a real Kafka broker.