# The Serde Data Model

## Serde Data Model Types

The serde data model, as defined by the Serde Book, contains 29 types, each referred to as "A Serde Data Type".

### 1 - `bool`

A type capable of expressing exclusively the values `true`

or `false`

.

### 2 - `i8`

A signed integer type, capable of expressing any value in the range of `-128..=127`

(or `-(2^7)..=((2^7) - 1)`

).

### 3 - `i16`

A signed integer type, capable of expressing any value in the range of `-32768..=32767`

(or `-(2^15)..=((2^15) - 1)`

).

### 4 - `i32`

A signed integer type, capable of expressing any value in the range of `-2147483648..=2147483647`

(or `-(2^31)..=((2^31) - 1)`

).

### 5 - `i64`

A signed integer type, capable of expressing any value in the range of `-9223372036854775808..=9223372036854775807`

(or `-(2^63)..=((2^63) - 1)`

).

### 6 - `i128`

A signed integer type, capable of expressing any value in the range of `-170141183460469231731687303715884105728..=170141183460469231731687303715884105727`

(or `-(2^127)..=((2^127) - 1)`

).

### 7 - `u8`

An unsigned integer type, capable of expressing any value in the range of `0..=255`

(or `0..=((2^8) - 1)`

).

### 8 - `u16`

An unsigned integer type, capable of expressing any value in the range of `0..=65535`

(or `0..=((2^16) - 1)`

).

### 9 - `u32`

An unsigned integer type, capable of expressing any value in the range of `0..=4294967295`

(or `0..=((2^32) - 1)`

).

### 10 - `u64`

An unsigned integer type, capable of expressing any value in the range of `0..=18446744073709551615`

(or `0..=((2^64) - 1)`

).

### 11 - `u128`

An unsigned integer type, capable of expressing any value in the range of `0..=340282366920938463463374607431768211456`

(or `0..=((2^128) - 1)`

).

### 12 - `f32`

A "binary32" type defined as defined in IEEE 754-2008.

### 13 - `f64`

A "binary64" type defined as defined in IEEE 754-2008.

### 14 - `char`

A four-byte type representing a Unicode scalar value.

A Unicode scalar value is defined by Unicode 14.0 Chapter 3 Section 9 - "Unicode Encoding Forms", Definition D76:

Unicode scalar value: Any Unicode code point except high-surrogate and low-surrogate code points.As a result of this definition, the set of Unicode scalar values consists of the ranges 0x0000_0000 to 0x0000_D7FF and 0x0000_E000 to 0x0010_FFFF inclusive.

### 15 - `string`

A type representing a variable quantity of bytes, which together represent a valid UTF-8 code point sequence, as defined by Unicode 14.0 Chapter 3 Section 9 - "Unicode Encoding Forms", Definition D92:

UTF-8 encoding form: The Unicode encoding form that assigns each Unicode scalar value to an unsigned byte sequence of one to four bytes in length, as specified in Table 3-6 and Table 3-7.

This encoding form is stored using the "UTF-8 encoding scheme", as defined by Unicode 14.0 Chapter 3 Section 10 - "Unicode Encoding Schemes", Definition D95:

UTF-8 encoding scheme: The Unicode encoding scheme that serializes a UTF-8 code unit sequence in exactly the same order as the code unit sequence itself.

### 16 - `byte array`

A type representing a variable quantity of bytes.

### 17 - `option`

A type representing zero or one Serde Data Type.

### 18 - `unit`

A type representing an anonymous value containing no data.

### 19 - `unit_struct`

A type representing a named value containing no data.

### 20 - `unit_variant`

A type representing a named, tagged union variant, containing no data.

### 21 - `newtype_struct`

A type representing a named value, containing exactly one anonymous Serde Data Type.

### 22 - `newtype_variant`

A type representing a named, tagged union variant, containing exactly one anonymous Serde Data Type.

### 23 - `seq`

A type representing a variable quantity of values of a single Serde Data Type, e.g. a "Homogeneous Array".

Values of each element of the `seq`

may have differing values.

### 24 - `tuple`

A type representing a fixed quantity of values, each of any Serde Data Type, e.g. a "Heterogeneous Array".

Values of each element of the `tuple`

may have differing values.

### 25 - `tuple_struct`

A type representing a named type specifcally containing exactly one `tuple`

Serde Data Type

### 26 - `tuple_variant`

A type representing a named, tagged union variant, containing exactly one `tuple`

Serde Data Type.

### 27 - `map`

A type representing a variable quantity of key-value pairs. All keys are values of a single Serde Data Type. All values are a values of a single Serde Data Type.

### 28 - `struct`

A type representing a fixed quantity of named values, each of any Serde Data Type.

Values of each element of the `tuple`

may have differing values.

NOTE: Similar to

`tuple`

s ,`struct`

s have a known number of members, however all members of a`struct`

also have a known name.

`struct`

s are also similar to`map`

s, in that each member has a name (as a key) and a value, however`struct`

s always have a fixed number of members, and their names are always constant.

### 29 - `struct_variant`

A type representing a named, tagged union variant, containing exactly one `struct`

Serde Data type

## Meta types

### Named and Anonymous types

The above discussion differentiates between "named types" and "anonymous types".

"named types" are used to describe types that are bound to a name within the data type they
are contained, such as a field of a `struct`

.

"anonymous types" are used to describe types that are NOT bound to a name within the data type
they are contained, such as a single element of a `tuple`

.

`enum`

s or Tagged Unions

In the Rust language, the `enum`

type (also known as "tagged unions" in other languages) describes a type that has
a differing internal type based on a value known as a `discriminant`

.

In the serde data model (as well as the rust language) `discriminants`

are always of the type `u32`

.

In the serde data model, the "internal type" of an `enum`

can be one of any of the following:

`unit_variant`

`newtype_variant`

`tuple_variant`

`struct_variant`

## References

Document Name | Full Name | Version |
---|---|---|

Serde Book | The Serde Book | v1.0.137 |

Unicode 14.0 Chapter 3 | The UnicodeĀ® Standard Core Specification, Chapter 3: Conformance | v14.0 |

IEEE 754-2008 | IEEE Standard for Floating-Point Arithmetic | 2008 |