tl;dr:
require "yaml"
a = [1,2,3]
YAML.load(YAML.dump({ a: a, b: a }))
# raises 'Psych::Visitors::NoAliasRuby#visit_Psych_Nodes_Alias': Alias parsing was not enabled. To enable it, pass `aliases: true` to `Psych::load` or `Psych::safe_load`. (Psych::AliasesNotEnabled)
Long form
Hey there, today I noticed an error that surprised me quite a lot. Essentially as soon as you include the same array twice in a structure that you dump through Psych, it will not be loadable using a default YAML.load. You'd have to pass specific options to make it loadable.
The problem is that dump will generate YAML in the form:
---
:a: &1
- 1
- 2
- 3
:b: *1
This preserves the array identity for the hashes stored under a and b.
That's surprising to me. I'd have expected that if load disables certain YAML features by default, that dump would also only use those on an opt-in basis. Even worse: I don't see a setting documented that would allow me to disable the alias creation. The two fixes available to me right now:
- enable alias deserialization (which I believed to be disabled by default for security considerations; though I fail to find a source for that now)
- duplicate values in my
dump input to avoid alias generation
Second solution shown in code:
YAML.load(YAML.dump({ a: a, b: a.dup }))
=> {a: [1, 2, 3], b: [1, 2, 3]}
tl;dr:
Long form
Hey there, today I noticed an error that surprised me quite a lot. Essentially as soon as you include the same array twice in a structure that you dump through
Psych, it will not beloadable using a defaultYAML.load. You'd have to pass specific options to make it loadable.The problem is that dump will generate YAML in the form:
This preserves the array identity for the hashes stored under
aandb.That's surprising to me. I'd have expected that if
loaddisables certain YAML features by default, that dump would also only use those on an opt-in basis. Even worse: I don't see a setting documented that would allow me to disable the alias creation. The two fixes available to me right now:dumpinput to avoid alias generationSecond solution shown in code: