Skip to content

Commit 08224bc

Browse files
author
rstam
committed
Better fix for CSHARP-418. Replaced MemberMaps property with AllMemberMaps and DeclaredMemberMaps to remove ambiguity.
1 parent 9e467cd commit 08224bc

File tree

5 files changed

+334
-320
lines changed

5 files changed

+334
-320
lines changed

Bson/Serialization/BsonClassMap.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,14 @@ protected BsonClassMap(Type classType)
7777
}
7878

7979
// public properties
80+
/// <summary>
81+
/// Gets all the member maps (including maps for inherited members).
82+
/// </summary>
83+
public IEnumerable<BsonMemberMap> AllMemberMaps
84+
{
85+
get { return _allMemberMaps; }
86+
}
87+
8088
/// <summary>
8189
/// Gets the base class map.
8290
/// </summary>
@@ -101,6 +109,14 @@ public ConventionProfile Conventions
101109
get { return _conventions; }
102110
}
103111

112+
/// <summary>
113+
/// Gets the declared member maps (only for members declared in this class).
114+
/// </summary>
115+
public IEnumerable<BsonMemberMap> DeclaredMemberMaps
116+
{
117+
get { return _declaredMemberMaps; }
118+
}
119+
104120
/// <summary>
105121
/// Gets the discriminator.
106122
/// </summary>
@@ -192,6 +208,7 @@ public IEnumerable<Type> KnownTypes
192208
/// <summary>
193209
/// Gets the member maps.
194210
/// </summary>
211+
[Obsolete("Use AllMemberMaps or DeclaredMemberMaps instead.")]
195212
public IEnumerable<BsonMemberMap> MemberMaps
196213
{
197214
get { return _allMemberMaps; }
@@ -507,7 +524,7 @@ public BsonClassMap Freeze()
507524
_baseClassMap = LookupClassMap(baseType);
508525
_discriminatorIsRequired |= _baseClassMap._discriminatorIsRequired;
509526
_hasRootClass |= (_isRootClass || _baseClassMap.HasRootClass);
510-
_allMemberMaps.AddRange(_baseClassMap.MemberMaps);
527+
_allMemberMaps.AddRange(_baseClassMap.AllMemberMaps);
511528
if (_baseClassMap.IgnoreExtraElements && _baseClassMap.IgnoreExtraElementsIsInherited)
512529
{
513530
_ignoreExtraElements = true;
@@ -627,10 +644,10 @@ public BsonClassMap Freeze()
627644
}
628645

629646
/// <summary>
630-
/// Gets a member map.
647+
/// Gets a member map (only considers members declared in this class).
631648
/// </summary>
632649
/// <param name="memberName">The member name.</param>
633-
/// <returns>The member map.</returns>
650+
/// <returns>The member map (or null if the member was not found).</returns>
634651
public BsonMemberMap GetMemberMap(string memberName)
635652
{
636653
if (memberName == null)

Bson/Serialization/BsonClassMapSerializer.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public object Deserialize(
130130
}
131131

132132
bsonReader.ReadStartDocument();
133-
var missingElementMemberMaps = new HashSet<BsonMemberMap>(classMap.MemberMaps); // make a copy!
133+
var missingElementMemberMaps = new HashSet<BsonMemberMap>(classMap.AllMemberMaps); // make a copy!
134134
var discriminatorConvention = BsonDefaultSerializer.LookupDiscriminatorConvention(nominalType);
135135
while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
136136
{
@@ -249,19 +249,16 @@ public BsonSerializationInfo GetItemSerializationInfo()
249249
/// <returns>The serialization info for the member.</returns>
250250
public BsonSerializationInfo GetMemberSerializationInfo(string memberName)
251251
{
252-
var classMap = _classMap;
253-
while (classMap != null)
252+
foreach (var memberMap in _classMap.AllMemberMaps)
254253
{
255-
var memberMap = classMap.GetMemberMap(memberName);
256-
if (memberMap != null)
254+
if (memberMap.MemberName == memberName)
257255
{
258256
var elementName = memberMap.ElementName;
259257
var serializer = memberMap.GetSerializer(memberMap.MemberType);
260258
var nominalType = memberMap.MemberType;
261259
var serializationOptions = memberMap.SerializationOptions;
262260
return new BsonSerializationInfo(elementName, serializer, nominalType, serializationOptions);
263261
}
264-
classMap = classMap.BaseClassMap;
265262
}
266263

267264
var message = string.Format(
@@ -338,7 +335,7 @@ public void Serialize(
338335
}
339336
}
340337

341-
foreach (var memberMap in classMap.MemberMaps)
338+
foreach (var memberMap in classMap.AllMemberMaps)
342339
{
343340
// note: if serializeIdFirst is false then idMemberMap will be null (so no property will be skipped)
344341
if (memberMap != idMemberMap)

BsonUnitTests/DefaultSerializer/Attributes/BsonAttributeTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ public void TestElement()
181181
var ordered = classMap.GetMemberMap("Ordered");
182182
Assert.AreEqual("ordered", ordered.ElementName);
183183
Assert.AreEqual(1, ordered.Order);
184-
Assert.AreSame(classMap.MemberMaps.First(), ordered);
184+
Assert.AreSame(classMap.AllMemberMaps.First(), ordered);
185185

186186
var noElement = classMap.GetMemberMap("NoElement");
187187
Assert.AreEqual("NoElement", noElement.ElementName);

0 commit comments

Comments
 (0)