public override void Serialize(
BsonWriter bsonWriter,
Type nominalType,
object value,
IBsonSerializationOptions options)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
var wrapper = (BsonDocumentWrapper)value;
var wrappedObject = wrapper.WrappedObject;
var wrappedActualType = (wrappedObject == null) ? wrapper.WrappedNominalType : wrappedObject.GetType();
var serializer = (wrappedActualType == wrapper.WrappedNominalType) ? wrapper.Serializer : BsonSerializer.LookupSerializer(wrappedActualType);
if (wrapper.IsUpdateDocument)
{
var savedCheckElementNames = bsonWriter.CheckElementNames;
var savedCheckUpdateDocument = bsonWriter.CheckUpdateDocument;
try
{
bsonWriter.CheckElementNames = false;
bsonWriter.CheckUpdateDocument = true;
serializer.Serialize(bsonWriter, wrapper.WrappedNominalType, wrapper.WrappedObject, wrapper.SerializationOptions);
}
finally
{
bsonWriter.CheckElementNames = savedCheckElementNames;
bsonWriter.CheckUpdateDocument = savedCheckUpdateDocument;
}
}
else
{
serializer.Serialize(bsonWriter, wrapper.WrappedNominalType, wrapper.WrappedObject, wrapper.SerializationOptions);
}
}
}