Summary
When using either `EnumRepresentationConvention` or `ObjectSerializerAllowedTypesConvention`, if the type is recursive with a collection of the same type, initialization will fail with the following exception: "System.InvalidOperationException: ValueFactory attempted to access the Value property of this instance."
Please provide the version of the driver. If applicable, please provide the MongoDB server version and topology (standalone, replica set, or sharded cluster).
Applies to current codebase as of 2026-02-28 (tested by running unit tests) and C# driver version 3.6.0.
How to Reproduce
In `MongoDB.Bson.Tests.Serialization.Conventions.EnumRepresentationConventionTests`, adjust class `C` definition and add the following test case:
_public class C
{
public E E
public E? NE { get; set; }
public E[] ArrayEnum { get; set; }
public E[][] ArrayOfArrayEnum { get; set; }
public Dictionary<string, E> DictionaryEnum { get; set; }
public Dictionary<string, E[]> NestedDictionaryEnum { get; set; }
public Dictionary<E, string> DictionaryKeyEnum { get; set; }
public int I { get; set; }
public int NI { get; set; }
public int[] ArrayInt { get; set; }
public C RecursiveProp { get; set; }
public C[] RecursivePropArray { get; set; }
}_
_[Fact]
public void Convention_should_work_with_recursive_type_when_top_level_is_false()
{
var pack = new ConventionPack { new EnumRepresentationConvention(BsonType.String, topLevelOnly: false) };
ConventionRegistry.Register("enumRecursive", pack, t => t == typeof(C));
_ = new BsonClassMap<C>(cm => cm.AutoMap()).Freeze();
ConventionRegistry.Remove("enumRecursive");
}_
Also reproducible in `MongoDB.Bson.Tests.Serialization.Conventions.ObjectSerializerAllowedTypesConventionTests` by adjusting the `TestClass` definition:
_private class TestClass
{
public object ObjectProp { get; set; }
public object[] ArrayOfObjectProp { get; set; }
public object[][] ArrayOfArrayOfObjectProp { get; set; }
public TestClass RecursiveProp { get; set; }
public TestClass[] RecursivePropArray { get; set; }
}_
Tests `Convention_should_work_with_recursive_type` and `Convention_should_be_applied_during_automapping` now fail.
Additional Background
Full stack trace of the failed unit test in `EnumRepresentationConventionTests`:
System.InvalidOperationException: ValueFactory attempted to access the Value property of this instance.System.InvalidOperationException ValueFactory attempted to access the Value property of this instance. at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) at System.Lazy`1.CreateValue() at MongoDB.Bson.Serialization.Serializers.EnumerableSerializerBase`2.get_ItemSerializer() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Serializers\EnumerableSerializerBase.cs:line 278 at MongoDB.Bson.Serialization.Serializers.ArraySerializer`1.MongoDB.Bson.Serialization.IChildSerializerConfigurable.get_ChildSerializer() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Serializers\ArraySerializer.cs:line 128 at MongoDB.Bson.Serialization.SerializerConfigurator.ReconfigureSerializerRecursively(IBsonSerializer serializer, Func`2 reconfigure) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\SerializerConfigurator.cs:line 49 at MongoDB.Bson.Serialization.Conventions.EnumRepresentationConvention.Apply(BsonMemberMap memberMap) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Conventions\EnumRepresentationConvention.cs:line 79 at MongoDB.Bson.Serialization.Conventions.ConventionRunner.Apply(BsonClassMap classMap) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Conventions\ConventionRunner.cs:line 61 at MongoDB.Bson.Serialization.BsonClassMap.AutoMapClass() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonClassMap.cs:line 1390 at MongoDB.Bson.Serialization.BsonClassMap.AutoMap() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonClassMap.cs:line 533 at MongoDB.Bson.Serialization.BsonClassMap.LookupClassMap(Type classType) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonClassMap.cs:line 354 at MongoDB.Bson.Serialization.BsonClassMapSerializationProvider.GetSerializer(Type type, IBsonSerializerRegistry serializerRegistry) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonClassMapSerializationProvider.cs:line 44 at MongoDB.Bson.Serialization.BsonSerializerRegistry.CreateSerializer(Type type) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonSerializerRegistry.cs:line 164 at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory) at MongoDB.Bson.Serialization.BsonSerializerRegistry.GetSerializer(Type type) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonSerializerRegistry.cs:line 65 at MongoDB.Bson.Serialization.BsonSerializerRegistry.GetSerializer[T]() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonSerializerRegistry.cs:line 78 at MongoDB.Bson.Serialization.Serializers.EnumerableSerializerBase`2.<>c__DisplayClass4_0.<.ctor>b__0() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Serializers\EnumerableSerializerBase.cs:line 266 at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) at System.Lazy`1.CreateValue() at MongoDB.Bson.Serialization.Serializers.EnumerableSerializerBase`2.get_ItemSerializer() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Serializers\EnumerableSerializerBase.cs:line 278 at MongoDB.Bson.Serialization.Serializers.ArraySerializer`1.MongoDB.Bson.Serialization.IChildSerializerConfigurable.get_ChildSerializer() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Serializers\ArraySerializer.cs:line 128 at MongoDB.Bson.Serialization.SerializerConfigurator.ReconfigureSerializerRecursively(IBsonSerializer serializer, Func`2 reconfigure) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\SerializerConfigurator.cs:line 49 at MongoDB.Bson.Serialization.Conventions.EnumRepresentationConvention.Apply(BsonMemberMap memberMap) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Conventions\EnumRepresentationConvention.cs:line 79 at MongoDB.Bson.Serialization.Conventions.ConventionRunner.Apply(BsonClassMap classMap) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Conventions\ConventionRunner.cs:line 61 at MongoDB.Bson.Serialization.BsonClassMap.AutoMapClass() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonClassMap.cs:line 1390 at MongoDB.Bson.Serialization.BsonClassMap.AutoMap() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonClassMap.cs:line 533 at MongoDB.Bson.Tests.Serialization.Conventions.EnumRepresentationConventionTests.<>c.<Convention_should_work_with_recursive_type_when_top_level_is_false>b__15_1(BsonClassMap`1 cm) in C:\dev\mongo-csharp-driver\tests\MongoDB.Bson.Tests\Serialization\Conventions\EnumRepresentationConventionTests.cs:line 234 at MongoDB.Bson.Serialization.BsonClassMap`1..ctor(Action`1 classMapInitializer) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonClassMap.cs:line 1508 at MongoDB.Bson.Tests.Serialization.Conventions.EnumRepresentationConventionTests.Convention_should_work_with_recursive_type_when_top_level_is_false() in C:\dev\mongo-csharp-driver\tests\MongoDB.Bson.Tests\Serialization\Conventions\EnumRepresentationConventionTests.cs:line 234 at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
- is caused by
-
CSHARP-2096 Make EnumRepresentationConvention also affect collections of Enums
-
- Closed
-
-
CSHARP-4495 Add conventions and attributes to configure ObjectSerializer AllowedTypes
-
- Closed
-
- related to
-
CSHARP-5493 After update to version 3.2.0 of the driver, one of our application stopped to work: stack overflow
-
- Closed
-
-
CSHARP-5508 Revisit Conventions.Apply
-
- Backlog
-