'a Blob.t
is type-equivalent to 'a
, but has different bin-prot serializers that prefix the representation with the size of 'a
.
To understand where this is useful, imagine we have an event type where many applications look at some parts of an event, but not all applications need to deal with all parts of an event. We might define:
type 'a event =
{ time : Time.t
; source : string
; details : 'a
} with bin_io
Applications that need to understand all the details of an event could use:
type concrete_event = Details.t Blob.t event with bin_io
An application that filters events to downsteam consumers based on just source
or time
(but doesn't need to parse details
) may use:
type opaque_event = Blob.Opaque.Bigstring.t event with bin_io
This has two advantages:
- (de)serializing messages is faster because potentially costly (de)serialization of
details
is avoided - the application can be compiled without any knowledge of any conrete
Details.t
type, so it's robust to changes in Details.t
An application that's happy to throw away details
may use:
type ignored_event = Blob.Ignored.t event with bin_read
Whereas opaque_event
s roundtrip, ignored_event
s actually drop the bytes representing details
when deserializing, and therefore do not roundtrip.