aaubry / YamlDotNet

YamlDotNet is a .NET library for YAML
MIT License
2.48k stars 466 forks source link

ArrayNodeDeserializer can now deserialize circular references. #937

Closed MetaFight closed 2 weeks ago

MetaFight commented 2 weeks ago

Resolves #933

The ArrayNodeDeserializer delegates the deserialization of elements to the CollectionNodeDeserializer.DeserializeHelper. This, in turn, handles circular references by relying on the IValuePromise.ValueAvailable event to write all the resolved references to its IList result parameter.

However, because ArrayNodeDeserializer doesn't know the size of its resulting array beforehand, it uses a temporary ArrayList which it passes to CollectionNodeDeserializer.DeserializeHelper. As a result, all resolved ValuePromise values are written to the temporary ArrayList instead of the final Array.

This PR fixes this by adding an optional Action<int, object?>? promiseResolvedHandler to CollectionNodeDeserializer.DeserializeHelper. When provided, it is used when ValuePromises are resolved. Otherwise, the existing behaviour is preserved.

MetaFight commented 2 weeks ago

I can't figure out why git thinks the entirety of the unit test file has changed. I've tried switching the line endings but I think in doing that (amending the commit and using push --force) I broke the CI build.

I'll have some time tomorrow to try and fix this.

EdwardCooke commented 2 weeks ago

The reason the CI failed is your branch name, when the PR branch is master the build fails.

MetaFight commented 2 weeks ago

I'm abandoning this PR because of the branch name issue. I'll create a new one with a better branch name.