Expand description
UUID support for BSON.
§The crate::Uuid
type
The BSON format supports UUIDs via the “binary” type with the UUID subtype (4).
To facilitate working with these UUID-subtyped binary values, this crate provides a
crate::Uuid
type, whose serde
implementation automatically serializes to and deserializes
from binary values with subtype 4.
The popular uuid
crate also provides a
UUID type,
though its serde
implementation does not produce or parse subtype 4
binary values. Instead, when serialized with bson::to_bson
, it produces as a string, and when
serialized with bson::to_vec
, it produces a binary value with subtype 0 rather than 4.
Because of this, it is highly recommended to use the crate::Uuid
type when working with BSON
instead of the uuid
crate’s Uuid
, since crate::Uuid
correctly produces subtype 4
binary values via either serialization function.
e.g.
use serde::{Serialize, Deserialize};
use bson::doc;
#[derive(Serialize, Deserialize)]
struct Foo {
/// serializes as a String or subtype 0 BSON binary, depending
/// on whether `bson::to_bson` or `bson::to_vec` is used.
uuid: uuid::Uuid,
/// serializes as a BSON binary with subtype 4 when either is used.
bson_uuid: bson::Uuid,
/// serializes as a BSON binary with subtype 4 when either is used.
/// this requires the "uuid-1" feature flag
#[serde(with = "bson::serde_helpers::uuid_1_as_binary")]
uuid_as_bson: uuid::Uuid,
}
§The uuid-1
feature flag
To facilitate the conversion between crate::Uuid
values and the uuid
crate’s Uuid
values, the uuid-1
feature flag can be enabled. This flag exposes a number of convenient
conversions, including the crate::Uuid::to_uuid_1
method and the From<uuid::Uuid>
implementation for Bson
, which allows the uuid
crate’s Uuid
values to be used in the
doc!
and bson!
macros.
use bson::doc;
// this automatic conversion does not require any feature flags
let query = doc! {
"uuid": bson::Uuid::new(),
};
// but this automatic conversion requires the "uuid-1" feature flag
let query = doc! {
"uuid": uuid::Uuid::new_v4(),
};
// this also requires the "uuid-1" feature flag.
let uuid = bson::Uuid::new().to_uuid_1();
For backwards compatibility, a uuid-0_8
feature flag can be enabled, which provides the same
API for interoperation with version 0.8 of the uuid
crate.
§The serde_with-3
feature flag
The serde_with-3
feature can be enabled to support more ergonomic serde attributes for
(de)serializing uuid::Uuid
from/to BSON via the serde_with
crate. The main benefit of this compared to the regular serde_helpers
is that serde_with-3
can handle nested uuid::Uuid
values (e.g. in Option
), whereas the former only works on
fields that are exactly uuid::Uuid
.
use serde::{Deserialize, Serialize};
use bson::doc;
#[serde_with_3::serde_as]
#[derive(Deserialize, Serialize, PartialEq, Debug)]
struct Foo {
/// Serializes as a BSON binary rather than using [`uuid::Uuid`]'s serialization
#[serde_as(as = "Option<bson::Uuid>")]
as_bson: Option<uuid::Uuid>,
}
let foo = Foo {
as_bson: Some(uuid::Uuid::new_v4()),
};
let expected = doc! {
"as_bson": bson::Uuid::from(foo.as_bson.unwrap()),
};
assert_eq!(bson::to_document(&foo)?, expected);
§Using crate::Uuid
with non-BSON formats
crate::Uuid
’s serde
implementation is the same as uuid::Uuid
’s
for non-BSON formats such as JSON:
use serde_json::json;
let uuid = uuid::Uuid::new_v4();
let bson_uuid: bson::Uuid = uuid.into();
let foo = Foo { uuid, bson_uuid, };
let json = serde_json::to_value(&foo)?;
assert_eq!(json, json!({ "uuid": uuid.to_string(), "bson_uuid": uuid.to_string() }));
Structs§
- A struct modeling a BSON UUID value (i.e. a Binary value with subtype 4).
Enums§
- Errors that can occur during
Uuid
construction and generation. - Enum of the possible representations to use when converting between
Uuid
andBinary
. This enum is necessary because the different drivers used to have different ways of encoding UUIDs, with the BSON subtype: 0x03 (UUID old). If a UUID has been serialized with a particular representation, it MUST be deserialized with the same representation.
Type Aliases§
- Alias for
Result<T, bson::uuid::Error>
.