Skip to content

Commit 7662d93

Browse files
committed
add check for derived class and change check to IsAssignableFrom
1 parent bab09cc commit 7662d93

2 files changed

Lines changed: 67 additions & 1 deletion

File tree

src/MongoDB.Bson/Serialization/BsonSerializerRegistry.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ private void EnsureRegisteringASerializerForThisTypeIsAllowed(IBsonSerializer se
191191
var message = string.Format("Generic type {0} has unassigned type parameters.", BsonUtils.GetFriendlyTypeName(type));
192192
throw new ArgumentException(message, "type");
193193
}
194-
if (type != serializer.ValueType)
194+
if (!serializer.ValueType.IsAssignableFrom(type))
195195
{
196196
throw new BsonSerializationException($"A serializer for {BsonUtils.GetFriendlyTypeName(serializer.ValueType)} cannot be registered for type {BsonUtils.GetFriendlyTypeName(type)}.");
197197
}

tests/MongoDB.Bson.Tests/Serialization/BsonSerializerRegistryTests.cs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,72 @@ public void TryRegisterSerializer_should_throw_when_type_and_serializer_do_not_m
115115
tryException.Message.Should().Contain("A serializer for Int32 cannot be registered for type Int64.");
116116
}
117117

118+
[Fact]
119+
public void RegisterSerializer_should_allow_serializer_for_base_type()
120+
{
121+
var subject = new BsonSerializerRegistry();
122+
var serializer = new PeopleSerializer();
123+
124+
var exception = Record.Exception(() => subject.RegisterSerializer(typeof(List<Person>), serializer));
125+
exception.Should().BeNull();
126+
127+
var people = new List<Person>
128+
{
129+
new Person { Name = "Alice" },
130+
new Person { Name = "Bob" }
131+
};
132+
133+
var json = people.ToJson<IEnumerable<Person>>();
134+
json.Should().Contain("Alice");
135+
json.Should().Contain("Bob");
136+
137+
}
138+
139+
[Fact]
140+
public void TryRegisterSerializer_should_allow_serializer_for_base_type()
141+
{
142+
var subject = new BsonSerializerRegistry();
143+
var serializer = new PeopleSerializer();
144+
145+
var exception = Record.Exception(() => subject.TryRegisterSerializer(typeof(List<Person>), serializer));
146+
exception.Should().BeNull();
147+
148+
var people = new List<Person>
149+
{
150+
new Person { Name = "Alice" },
151+
new Person { Name = "Bob" }
152+
};
153+
154+
var json = people.ToJson<IEnumerable<Person>>();
155+
json.Should().Contain("Alice");
156+
json.Should().Contain("Bob");
157+
158+
}
159+
160+
private class Person
161+
{
162+
public string Name { get; set; }
163+
}
164+
165+
private class PeopleSerializer : SerializerBase<IEnumerable<Person>>
166+
{
167+
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, IEnumerable<Person> value)
168+
{
169+
context.Writer.WriteStartArray();
170+
foreach (var person in value)
171+
{
172+
context.Writer.WriteStartDocument();
173+
context.Writer.WriteName("Name");
174+
context.Writer.WriteString(person.Name);
175+
context.Writer.WriteEndDocument();
176+
}
177+
context.Writer.WriteEndArray();
178+
}
179+
180+
public override IEnumerable<Person> Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
181+
=> throw new NotImplementedException();
182+
}
183+
118184
[Fact]
119185
public void TryRegisterSerializer_should_return_true_when_serializer_is_not_already_registered()
120186
{

0 commit comments

Comments
 (0)