If Boost can serialize the whole thing in one step, then doing that (instead of manually feeding it each element) is less verbose and therefore better.
.write((char*)&recipe, sizeof(recipe))
wouldn't work correctly if recipe
contains a vector, so you have to apply it to every element (assuming it will work for them in the first place).