BARE Message Encoding
Binary Application Record Encoding
BARE is a simple binary representation for structured application data.
NOTICE: The BARE encoding is not finalized.
Feedback is welcome.
draft-devault-bare
has been filed with the IETF as an Internet-Draft and represents the latest
authoritative draft of the specification.
BARE at a glance
Messages are encoded in binary and compact in size. Messages do not contain
schema information — they are not self-describing.
BARE is optimized for small messages. It is not optimized for encoding
large amounts of data in a single message, or efficiently reading a message
with fields of a fixed size. However, all types are aligned to 8 bits,
which does exchange some space for simplicity.
BARE's approach to extensibility is conservative: messages encoded today
will be decodable tomorrow, and vice-versa. But extensibility is still
possible; implementations can choose to decode user-defined types at a
higher level and map them onto arbitrary data types.
The specification is likewise conservative. Simple implementations of
message decoders and encoders can be written inside of an afternoon.
An optional DSL is provided
to document message schemas and provide a source for code generation.
However, if you prefer, you may also define your schema using the type
system already available in your programming language.
Here is a sample schema:
type PublicKey data[128]
type Time str # ISO 8601
type Department enum {
ACCOUNTING
ADMINISTRATION
CUSTOMER_SERVICE
DEVELOPMENT
# Reserved for the CEO
JSMITH = 99
}
type Address list<str>[4] # street, city, state, country
type Customer struct {
name: str
email: str
address: Address
orders: list<struct {
orderId: i64
quantity: i32
}>
metadata: map<str><data>
}
type Employee struct {
name: str
email: str
address: Address
department: Department
hireDate: Time
publicKey: optional<PublicKey>
metadata: map<str><data>
}
type TerminatedEmployee void
type Person union {Customer | Employee | TerminatedEmployee}