0.9.0
API documentation: https://docs.rs/serde_yaml/0.9
Highlights
-
The
serde_yaml::Value
enum gains aTagged
variant which represents the deserialization of YAML's!Tag
syntax. Tagged scalars, sequences, and mappings are all supported. -
An empty YAML input (or document containing only comments) will deserialize successfully to an empty map, empty sequence, or Serde struct as long as the struct has only optional fields. Previously this would error.
-
A new
.apply_merge()
method onValue
implements YAML's<<
merge key convention. -
The
Debug
representation ofserde_yaml::Value
has gotten vastly better (#287). -
Deserialization of borrowed strings now works.
#[derive(Deserialize, Debug)] struct Struct<'a> { borrowed: &'a str, } let yaml = "borrowed: 'kölcsönzött'\n"; let value: Struct = serde_yaml::from_str(yaml)?; println!("{:#?}", value);
-
Value
's andMapping
's methodsget
andget_mut
have been generalized to support a &str argument, as opposed to requiring you to allocate and construct aValue::String
for indexing into another existingValue
. -
Mapping
exposes more APIs that have become conventional on map data structures, such as.keys()
,.values()
,.into_keys()
,.into_values()
,.values_mut()
, and.retain(|k, v| …)
.
Breaking changes
-
Serialization no longer produces leading
---\n
on the serialized output. You can prepend this yourself if your use case demands it. -
Serialization of enum variants is now based on YAML's
!Tag
syntax, rather than JSON-style singleton maps.#[derive(Serialize, Deserialize)] enum Enum { Newtype(usize), Tuple(usize, usize, usize), Struct { x: f64, y: f64 }, }
- !Newtype 1 - !Tuple [0, 0, 0] - !Struct {x: 1.0, y: 2.0}
-
A bunch of non-base-10 edge cases in number parsing have been resolved. For example
0x+1
and++0x1
are now parsed as strings, whereas they used to be incorrectly treated as numbers. -
Deserializers obtained through iteration can no longer be iterated further:
let deserializer = serde_yaml::Deserializer::from_str(multiple_documents); for de in deserializer { // correct: let myvalue = T::deserialize(de)?; // incorrect: used to produce some questionable result, now produces 0 sub-documents for questionable in de { let wat = T::deserialize(questionable)?; } }
-
The abandoned yaml-rust crate is no longer used as the YAML backend. The new libyaml-based backend surely has different edge cases and quirks than yaml-rust.
-
Some excessive
PartialEq
impls have been eliminated. -
The
serde_yaml::to_vec
function has been removed. Useserde_yaml::to_writer
for doing I/O, or useserde_yaml::to_string
+.into_bytes()
on the resulting String. -
The
serde_yaml::seed
module has been removed. Now that aserde_yaml::Deserializer
is publicly available, the same use cases can be addressed viaseed.deserialize(Deserializer::from_str(…))
instead.
Bugfixes
-
Empty values in a mapping are supported, and deserialize to empty string when the corresponding struct field is of type string. Previously they would deserialize to "~" which makes no sense.
-
128-bit integer deserialization now supports hex and octal input.
-
Serde_yaml now includes a mitigation against a "billion laughs" attack in which malicious input involving YAML anchors and aliases is used to consume an amount of processing or memory that is exponential in the size of the input document. Serde_yaml will quickly produce an error in this situation instead.