Skip to content

Commit 6ca1c4a

Browse files
committed
fix option serialization
1 parent 32eebf9 commit 6ca1c4a

2 files changed

Lines changed: 13 additions & 5 deletions

File tree

src/FSharp.MongoDB.Bson/Serialization/Serializers/FSharpOptionSerializer.fs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ open MongoDB.Bson.Serialization.Serializers
2626
type FSharpOptionSerializer<'T when 'T: not null>() =
2727
inherit SerializerBase<'T option>()
2828

29-
let serializer = lazy (BsonSerializer.LookupSerializer<'T>())
29+
let serializer : Lazy<IBsonSerializer<'T>> =
30+
lazy (BsonSerializer.LookupSerializer<'T>())
3031

3132
override _.Serialize (context, args, value) =
3233
let writer = context.Writer
@@ -40,4 +41,6 @@ type FSharpOptionSerializer<'T when 'T: not null>() =
4041

4142
match reader.GetCurrentBsonType() with
4243
| BsonType.Null -> reader.ReadNull(); None
43-
| t -> Some (serializer.Value.Deserialize(context, args))
44+
| _ ->
45+
// Use the inner serializer's nominal type to avoid recursing through the option serializer.
46+
Some (serializer.Value.Deserialize(context))

src/FSharp.MongoDB.Bson/Serialization/Serializers/FSharpValueOptionSerializer.fs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,23 @@ open MongoDB.Bson.Serialization.Serializers
2626
type FSharpValueOptionSerializer<'T when 'T: not null>() =
2727
inherit SerializerBase<'T voption>()
2828

29-
let serializer = lazy (BsonSerializer.LookupSerializer<'T>())
29+
let serializer : Lazy<IBsonSerializer<'T>> =
30+
lazy (BsonSerializer.LookupSerializer<'T>())
3031

3132
override _.Serialize (context, args, value) =
3233
let writer = context.Writer
3334

3435
match value with
35-
| ValueSome x -> serializer.Value.Serialize(context, args, x :> obj)
36+
| ValueSome x ->
37+
// Serialize using the inner serializer's nominal type.
38+
serializer.Value.Serialize(context, x)
3639
| ValueNone -> writer.WriteNull()
3740

3841
override _.Deserialize (context, args) =
3942
let reader = context.Reader
4043

4144
match reader.GetCurrentBsonType() with
4245
| BsonType.Null -> reader.ReadNull(); ValueNone
43-
| _ -> ValueSome (serializer.Value.Deserialize(context, args))
46+
| _ ->
47+
// Use the inner serializer's nominal type to avoid recursing through the option serializer.
48+
ValueSome (serializer.Value.Deserialize(context))

0 commit comments

Comments
 (0)