Skip to content

Commit d39732a

Browse files
committed
replaced IBsonArraySerializer's GetItemSerializationInfo with TryGetItemSerializationInfo.
1 parent bcaae31 commit d39732a

14 files changed

+113
-91
lines changed

src/MongoDB.Bson/Serialization/IBsonArraySerializer.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,12 @@ namespace MongoDB.Bson.Serialization
2121
public interface IBsonArraySerializer : IBsonSerializer
2222
{
2323
/// <summary>
24-
/// Gets the serialization info for individual items of the array.
24+
/// Tries to get the serialization info for the individual items of the array.
2525
/// </summary>
26-
/// <returns>The serialization info for the items.</returns>
27-
BsonSerializationInfo GetItemSerializationInfo();
26+
/// <param name="serializationInfo">The serialization information.</param>
27+
/// <returns>
28+
/// <c>true</c> if the serialization info exists; otherwise <c>false</c>.
29+
///</returns>
30+
bool TryGetItemSerializationInfo(out BsonSerializationInfo serializationInfo);
2831
}
2932
}

src/MongoDB.Bson/Serialization/Serializers/BsonArraySerializer.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,19 @@ protected override BsonArray DeserializeValue(BsonDeserializationContext context
6666
}
6767

6868
/// <summary>
69-
/// Gets the serialization info for individual items of the array.
69+
/// Tries to get the serialization info for the individual items of the array.
7070
/// </summary>
71+
/// <param name="serializationInfo">The serialization information.</param>
7172
/// <returns>
72-
/// The serialization info for the items.
73+
/// <c>true</c> if the serialization info exists; otherwise <c>false</c>.
7374
/// </returns>
74-
public BsonSerializationInfo GetItemSerializationInfo()
75+
public bool TryGetItemSerializationInfo(out BsonSerializationInfo serializationInfo)
7576
{
76-
return new BsonSerializationInfo(
77+
serializationInfo = new BsonSerializationInfo(
7778
null,
7879
BsonValueSerializer.Instance,
7980
typeof(BsonValue));
81+
return true;
8082
}
8183

8284
// protected methods

src/MongoDB.Bson/Serialization/Serializers/BsonValueCSharpNullSerializer.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,14 +133,15 @@ public BsonValueCSharpNullArrayAndDocumentSerializer(IBsonSerializer<TBsonValue>
133133
}
134134

135135
/// <summary>
136-
/// Gets the serialization info for individual items of the array.
136+
/// Tries to get the serialization info for the individual items of the array.
137137
/// </summary>
138+
/// <param name="serializationInfo">The serialization information.</param>
138139
/// <returns>
139140
/// The serialization info for the items.
140141
/// </returns>
141-
public BsonSerializationInfo GetItemSerializationInfo()
142+
public bool TryGetItemSerializationInfo(out BsonSerializationInfo serializationInfo)
142143
{
143-
return BsonValueSerializer.Instance.GetItemSerializationInfo();
144+
return BsonValueSerializer.Instance.TryGetItemSerializationInfo(out serializationInfo);
144145
}
145146

146147
/// <summary>
@@ -175,14 +176,15 @@ public BsonValueCSharpNullArraySerializer(IBsonSerializer<TBsonValue> wrappedSer
175176
}
176177

177178
/// <summary>
178-
/// Gets the serialization info for individual items of the array.
179+
/// Tries to get the serialization info for the individual items of the array.
179180
/// </summary>
181+
/// <param name="serializationInfo">The serialization information.</param>
180182
/// <returns>
181-
/// The serialization info for the items.
183+
/// <c>true</c> if the serialization info exists; otherwise <c>false</c>.
182184
/// </returns>
183-
public BsonSerializationInfo GetItemSerializationInfo()
185+
public bool TryGetItemSerializationInfo(out BsonSerializationInfo serializationInfo)
184186
{
185-
return BsonValueSerializer.Instance.GetItemSerializationInfo();
187+
return BsonValueSerializer.Instance.TryGetItemSerializationInfo(out serializationInfo);
186188
}
187189
}
188190

src/MongoDB.Bson/Serialization/Serializers/BsonValueSerializer.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,17 +102,19 @@ public bool TryGetMemberSerializationInfo(string memberName, out BsonSerializati
102102
}
103103

104104
/// <summary>
105-
/// Gets the serialization info for individual items of the array.
105+
/// Tries to get the serialization info for the individual items of the array.
106106
/// </summary>
107+
/// <param name="serializationInfo">The serialization information.</param>
107108
/// <returns>
108-
/// The serialization info for the items.
109+
/// <c>true</c> if the serialization info exists; otherwise <c>false</c>.
109110
/// </returns>
110-
public BsonSerializationInfo GetItemSerializationInfo()
111+
public bool TryGetItemSerializationInfo(out BsonSerializationInfo serializationInfo)
111112
{
112-
return new BsonSerializationInfo(
113+
serializationInfo = new BsonSerializationInfo(
113114
null,
114115
BsonValueSerializer.Instance,
115116
typeof(BsonValue));
117+
return true;
116118
}
117119

118120
/// <summary>

src/MongoDB.Bson/Serialization/Serializers/EnumerableSerializerBase.cs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -110,13 +110,16 @@ public override TValue Deserialize(BsonDeserializationContext context, BsonDeser
110110
}
111111

112112
/// <summary>
113-
/// Gets the serialization info for individual items of an enumerable type.
113+
/// Tries to get the serialization info for the individual items of the array.
114114
/// </summary>
115-
/// <returns>The serialization info for the items.</returns>
116-
public BsonSerializationInfo GetItemSerializationInfo()
115+
/// <param name="serializationInfo">The serialization information.</param>
116+
/// <returns>
117+
/// <c>true</c> if the serialization info exists; otherwise <c>false</c>.
118+
/// </returns>
119+
public bool TryGetItemSerializationInfo(out BsonSerializationInfo serializationInfo)
117120
{
118-
string elementName = null;
119-
return new BsonSerializationInfo(elementName, _itemSerializer, _itemSerializer.ValueType);
121+
serializationInfo = new BsonSerializationInfo(null, _itemSerializer, _itemSerializer.ValueType);
122+
return true;
120123
}
121124

122125
/// <summary>
@@ -275,13 +278,16 @@ public override TValue Deserialize(BsonDeserializationContext context, BsonDeser
275278
}
276279

277280
/// <summary>
278-
/// Gets the serialization info for individual items of an enumerable type.
281+
/// Tries to get the serialization info for the individual items of the array.
279282
/// </summary>
280-
/// <returns>The serialization info for the items.</returns>
281-
public BsonSerializationInfo GetItemSerializationInfo()
283+
/// <param name="serializationInfo">The serialization information.</param>
284+
/// <returns>
285+
/// The serialization info for the items.
286+
/// </returns>
287+
public bool TryGetItemSerializationInfo(out BsonSerializationInfo serializationInfo)
282288
{
283-
string elementName = null;
284-
return new BsonSerializationInfo(elementName, _itemSerializer, _itemSerializer.ValueType);
289+
serializationInfo = new BsonSerializationInfo(null, _itemSerializer, _itemSerializer.ValueType);
290+
return true;
285291
}
286292

287293
/// <summary>

src/MongoDB.Bson/Serialization/Serializers/ImpliedImplementationInterfaceSerializer.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -168,20 +168,22 @@ public override TInterface Deserialize(BsonDeserializationContext context, BsonD
168168
}
169169

170170
/// <summary>
171-
/// Gets the serialization info for individual items of the array.
171+
/// Tries to get the serialization info for the individual items of the array.
172172
/// </summary>
173+
/// <param name="serializationInfo">The serialization information.</param>
173174
/// <returns>
174-
/// The serialization info for the items.
175+
/// <c>true</c> if the serialization info exists; otherwise <c>false</c>.
175176
/// </returns>
176-
public BsonSerializationInfo GetItemSerializationInfo()
177+
public bool TryGetItemSerializationInfo(out BsonSerializationInfo serializationInfo)
177178
{
178179
var arraySerializer = _implementationSerializer as IBsonArraySerializer;
179180
if (arraySerializer != null)
180181
{
181-
return arraySerializer.GetItemSerializationInfo();
182+
return arraySerializer.TryGetItemSerializationInfo(out serializationInfo);
182183
}
183184

184-
return null;
185+
serializationInfo = null;
186+
return false;
185187
}
186188

187189
/// <summary>

src/MongoDB.Driver.Legacy/Linq/Utils/BsonSerializationInfoFinder.cs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -108,20 +108,20 @@ protected override BsonSerializationInfo VisitBinary(BinaryExpression node)
108108
return null;
109109
}
110110

111-
var arraySerializer = serializationInfo.Serializer as IBsonArraySerializer;
112-
if (arraySerializer == null)
111+
var indexEpression = node.Right as ConstantExpression;
112+
if (indexEpression == null)
113113
{
114114
return null;
115115
}
116+
var index = Convert.ToInt32(indexEpression.Value);
116117

117-
var indexEpression = node.Right as ConstantExpression;
118-
if (indexEpression == null)
118+
var arraySerializer = serializationInfo.Serializer as IBsonArraySerializer;
119+
BsonSerializationInfo itemSerializationInfo;
120+
if (arraySerializer == null || !arraySerializer.TryGetItemSerializationInfo(out itemSerializationInfo))
119121
{
120122
return null;
121123
}
122-
var index = Convert.ToInt32(indexEpression.Value);
123124

124-
var itemSerializationInfo = arraySerializer.GetItemSerializationInfo();
125125
itemSerializationInfo = new BsonSerializationInfo(
126126
index.ToString(),
127127
itemSerializationInfo.Serializer,
@@ -256,10 +256,9 @@ private BsonSerializationInfo VisitGetItem(MethodCallExpression node)
256256
indexExpression.Type == typeof(ulong))
257257
{
258258
var arraySerializer = serializationInfo.Serializer as IBsonArraySerializer;
259-
if (arraySerializer != null)
259+
BsonSerializationInfo itemSerializationInfo;
260+
if (arraySerializer != null && arraySerializer.TryGetItemSerializationInfo(out itemSerializationInfo))
260261
{
261-
var itemSerializationInfo = arraySerializer.GetItemSerializationInfo();
262-
263262
itemSerializationInfo = new BsonSerializationInfo(
264263
indexName,
265264
itemSerializationInfo.Serializer,
@@ -293,13 +292,13 @@ private BsonSerializationInfo VisitElementAt(MethodCallExpression node)
293292
}
294293

295294
var arraySerializer = serializationInfo.Serializer as IBsonArraySerializer;
296-
if (arraySerializer == null)
295+
BsonSerializationInfo itemSerializationInfo;
296+
if (arraySerializer == null || !arraySerializer.TryGetItemSerializationInfo(out itemSerializationInfo))
297297
{
298298
return null;
299299
}
300300

301301
var index = (int)((ConstantExpression)node.Arguments[1]).Value;
302-
var itemSerializationInfo = arraySerializer.GetItemSerializationInfo();
303302
itemSerializationInfo = new BsonSerializationInfo(
304303
index.ToString(),
305304
itemSerializationInfo.Serializer,

src/MongoDB.Driver.Legacy/Linq/Utils/BsonSerializationInfoHelper.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,9 @@ public bool TryGetItemSerializationInfo(BsonSerializationInfo serializationInfo,
8989
{
9090
itemSerializationInfo = null;
9191
var arraySerializer = serializationInfo.Serializer as IBsonArraySerializer;
92-
if (arraySerializer != null)
92+
if (arraySerializer != null && arraySerializer.TryGetItemSerializationInfo(out itemSerializationInfo))
9393
{
94-
itemSerializationInfo = arraySerializer.GetItemSerializationInfo();
95-
if (itemSerializationInfo != null)
96-
{
97-
return true;
98-
}
94+
return true;
9995
}
10096

10197
return false;

src/MongoDB.Driver/FieldDefinition.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -365,9 +365,8 @@ public static void Resolve<TDocument>(string fieldName, IBsonSerializer<TDocumen
365365
if (nameParts[i] == "$" || nameParts[i].All(char.IsDigit))
366366
{
367367
arraySerializer = resolvedFieldSerializer as IBsonArraySerializer;
368-
if (arraySerializer != null)
368+
if (arraySerializer != null && arraySerializer.TryGetItemSerializationInfo(out serializationInfo))
369369
{
370-
serializationInfo = arraySerializer.GetItemSerializationInfo();
371370
resolvedFieldSerializer = serializationInfo.Serializer;
372371
continue;
373372
}
@@ -381,9 +380,8 @@ public static void Resolve<TDocument>(string fieldName, IBsonSerializer<TDocumen
381380
{
382381
// need to check if this is an any element array match
383382
arraySerializer = resolvedFieldSerializer as IBsonArraySerializer;
384-
if (arraySerializer != null)
383+
if (arraySerializer != null && arraySerializer.TryGetItemSerializationInfo(out serializationInfo))
385384
{
386-
serializationInfo = arraySerializer.GetItemSerializationInfo();
387385
documentSerializer = serializationInfo.Serializer as IBsonDocumentSerializer;
388386
if (documentSerializer == null || !documentSerializer.TryGetMemberSerializationInfo(nameParts[i], out serializationInfo))
389387
{

src/MongoDB.Driver/FilterDefinitionBuilder.cs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,12 +1159,13 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
11591159
if (renderedField.FieldSerializer != null)
11601160
{
11611161
var arraySerializer = renderedField.FieldSerializer as IBsonArraySerializer;
1162-
if (arraySerializer == null)
1162+
BsonSerializationInfo itemSerializationInfo;
1163+
if (arraySerializer == null || !arraySerializer.TryGetItemSerializationInfo(out itemSerializationInfo))
11631164
{
1164-
var message = string.Format("The serializer for field '{0}' must implement IBsonArraySerializer.", renderedField.FieldName);
1165+
var message = string.Format("The serializer for field '{0}' must implement IBsonArraySerializer and provide item serialization info.", renderedField.FieldName);
11651166
throw new InvalidOperationException(message);
11661167
}
1167-
itemSerializer = arraySerializer.GetItemSerializationInfo().Serializer;
1168+
itemSerializer = itemSerializationInfo.Serializer;
11681169
}
11691170
else
11701171
{
@@ -1212,12 +1213,13 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
12121213
if (renderedField.FieldSerializer != null)
12131214
{
12141215
var arraySerializer = renderedField.FieldSerializer as IBsonArraySerializer;
1215-
if (arraySerializer == null)
1216+
BsonSerializationInfo itemSerializationInfo;
1217+
if (arraySerializer == null || !arraySerializer.TryGetItemSerializationInfo(out itemSerializationInfo))
12161218
{
1217-
var message = string.Format("The serializer for field '{0}' must implement IBsonArraySerializer.", renderedField.FieldName);
1219+
var message = string.Format("The serializer for field '{0}' must implement IBsonArraySerializer and provide item serialization info.", renderedField.FieldName);
12181220
throw new InvalidOperationException(message);
12191221
}
1220-
itemSerializer = (IBsonSerializer<TItem>)arraySerializer.GetItemSerializationInfo().Serializer;
1222+
itemSerializer = (IBsonSerializer<TItem>)itemSerializationInfo.Serializer;
12211223
}
12221224
else
12231225
{
@@ -1652,12 +1654,13 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
16521654
if (renderedField.FieldSerializer != null)
16531655
{
16541656
var arraySerializer = renderedField.FieldSerializer as IBsonArraySerializer;
1655-
if (arraySerializer == null)
1657+
BsonSerializationInfo itemSerializationInfo;
1658+
if (arraySerializer == null || !arraySerializer.TryGetItemSerializationInfo(out itemSerializationInfo))
16561659
{
1657-
var message = string.Format("The serializer for field '{0}' must implement IBsonArraySerializer.", renderedField.FieldName);
1660+
var message = string.Format("The serializer for field '{0}' must implement IBsonArraySerializer and provide item serialization info.", renderedField.FieldName);
16581661
throw new InvalidOperationException(message);
16591662
}
1660-
itemSerializer = arraySerializer.GetItemSerializationInfo().Serializer;
1663+
itemSerializer = itemSerializationInfo.Serializer;
16611664
}
16621665
else
16631666
{
@@ -1700,12 +1703,13 @@ public override BsonDocument Render(IBsonSerializer<TDocument> documentSerialize
17001703
if (renderedField.FieldSerializer != null)
17011704
{
17021705
var arraySerializer = renderedField.FieldSerializer as IBsonArraySerializer;
1703-
if (arraySerializer == null)
1706+
BsonSerializationInfo itemSerializationInfo;
1707+
if (arraySerializer == null || !arraySerializer.TryGetItemSerializationInfo(out itemSerializationInfo))
17041708
{
1705-
var message = string.Format("The serializer for field '{0}' must implement IBsonArraySerializer.", renderedField.FieldName);
1709+
var message = string.Format("The serializer for field '{0}' must implement IBsonArraySerializer and provide item serialization info.", renderedField.FieldName);
17061710
throw new InvalidOperationException(message);
17071711
}
1708-
itemSerializer = (IBsonSerializer<TItem>)arraySerializer.GetItemSerializationInfo().Serializer;
1712+
itemSerializer = (IBsonSerializer<TItem>)itemSerializationInfo.Serializer;
17091713
}
17101714
else
17111715
{

0 commit comments

Comments
 (0)