YamlDotNet icon indicating copy to clipboard operation
YamlDotNet copied to clipboard

ArrayNodeDeserializer can now deserialize circular references.

Open MetaFight opened this issue 1 year ago • 0 comments
trafficstars

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 avatar Jun 20 '24 11:06 MetaFight