Skip to content

Commit

Permalink
Merge branch 'pr/n359_psaxton'
Browse files Browse the repository at this point in the history
  • Loading branch information
Antoine Aubry committed Dec 5, 2018
2 parents 764454a + 59332fd commit 31e615f
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 4 deletions.
20 changes: 20 additions & 0 deletions YamlDotNet/Serialization/ObjectGraphTraversalStrategyFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using System.Collections.Generic;

namespace YamlDotNet.Serialization
{
/// <summary>
/// A factory method for creating <see cref="IObjectGraphTraversalStrategy"/> instances
/// </summary>
/// <param name="typeInspector">The type inspector to be used by the traversal strategy.</param>
/// <param name="typeResolver">The type resolver to be used by the traversal strategy.</param>
/// <param name="typeConverters">The type converters to be used by the traversal strategy.</param>
/// <param name="maximumRecursion">The maximum object depth to be supported by the traversal strategy.</param>
/// <returns></returns>
public delegate IObjectGraphTraversalStrategy
ObjectGraphTraversalStrategyFactory(
ITypeInspector typeInspector,
ITypeResolver typeResolver,
IEnumerable<IYamlTypeConverter> typeConverters,
int maximumRecursion
);
}
20 changes: 16 additions & 4 deletions YamlDotNet/Serialization/SerializerBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ namespace YamlDotNet.Serialization
/// </summary>
public sealed class SerializerBuilder : BuilderSkeleton<SerializerBuilder>
{
private Func<ITypeInspector, ITypeResolver, IEnumerable<IYamlTypeConverter>, IObjectGraphTraversalStrategy> objectGraphTraversalStrategyFactory;
private ObjectGraphTraversalStrategyFactory objectGraphTraversalStrategyFactory;
private readonly LazyComponentRegistrationList<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>> preProcessingPhaseObjectGraphVisitorFactories;
private readonly LazyComponentRegistrationList<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>> emissionPhaseObjectGraphVisitorFactories;
private readonly LazyComponentRegistrationList<IEventEmitter, IEventEmitter> eventEmitterFactories;
Expand Down Expand Up @@ -70,7 +70,7 @@ public SerializerBuilder()
eventEmitterFactories = new LazyComponentRegistrationList<IEventEmitter, IEventEmitter>();
eventEmitterFactories.Add(typeof(TypeAssigningEventEmitter), inner => new TypeAssigningEventEmitter(inner, false, tagMappings));

objectGraphTraversalStrategyFactory = (typeInspector, typeResolver, typeConverters) => new FullObjectGraphTraversalStrategy(typeInspector, typeResolver, maximumRecursion, namingConvention ?? new NullNamingConvention());
objectGraphTraversalStrategyFactory = (typeInspector, typeResolver, typeConverters, maximumRecursion) => new FullObjectGraphTraversalStrategy(typeInspector, typeResolver, maximumRecursion, namingConvention ?? new NullNamingConvention());

WithTypeResolver(new DynamicTypeResolver());
}
Expand Down Expand Up @@ -222,7 +222,7 @@ public SerializerBuilder WithoutTagMapping(Type type)
/// </summary>
public SerializerBuilder EnsureRoundtrip()
{
objectGraphTraversalStrategyFactory = (typeInspector, typeResolver, typeConverters) => new RoundtripObjectGraphTraversalStrategy(
objectGraphTraversalStrategyFactory = (typeInspector, typeResolver, typeConverters, maximumRecursion) => new RoundtripObjectGraphTraversalStrategy(
typeConverters,
typeInspector,
typeResolver,
Expand Down Expand Up @@ -369,6 +369,18 @@ public SerializerBuilder WithoutPreProcessingPhaseObjectGraphVisitor(Type object
return this;
}

/// <summary>
/// Registers an <see cref="ObjectGraphTraversalStrategyFactory"/> to be used by the serializer
/// while traversing the object graph.
/// </summary>
/// <param name="objectGraphTraversalStrategyFactory">A function that instantiates the traversal strategy.</param>
public SerializerBuilder WithObjectGraphTraversalStrategyFactory(ObjectGraphTraversalStrategyFactory objectGraphTraversalStrategyFactory)
{
this.objectGraphTraversalStrategyFactory = objectGraphTraversalStrategyFactory;

return this;
}

/// <summary>
/// Registers an additional <see cref="IObjectGraphVisitor{IEmitter}" /> to be used by the serializer
/// while emitting an object graph.
Expand Down Expand Up @@ -472,7 +484,7 @@ public IValueSerializer BuildValueSerializer()
{
var typeConverters = BuildTypeConverters();
var typeInspector = BuildTypeInspector();
var traversalStrategy = objectGraphTraversalStrategyFactory(typeInspector, typeResolver, typeConverters);
var traversalStrategy = objectGraphTraversalStrategyFactory(typeInspector, typeResolver, typeConverters, maximumRecursion);
var eventEmitter = eventEmitterFactories.BuildComponentChain(new WriterEventEmitter());

return new ValueSerializer(
Expand Down

0 comments on commit 31e615f

Please sign in to comment.