private void DeserializeMember(BsonReader bsonReader, object obj, BsonMemberMap memberMap)
 {
     try
     {
         Type   memberType = memberMap.MemberType;
         Type   actualType = bsonReader.CurrentBsonType != BsonType.Null ? BsonDefaultSerializer.LookupDiscriminatorConvention(memberType).GetActualType(bsonReader, memberType) : memberType;
         object obj1       = memberMap.GetSerializer(actualType).Deserialize(bsonReader, memberType, actualType, memberMap.SerializationOptions);
         // --- Added
         if (IsRelation(memberMap))
         {
             ValidateVirtualRelation(memberMap);
             if (obj1 != null)
             {
                 if (IsReferencesManyRelation(memberMap))
                 {
                     ((IDocument)obj).ReferencesManyIDs[memberMap.MemberName] = ((IEnumerable)obj1).Cast <ObjectId>().ToList();
                 }
                 else
                 {
                     ((IDocument)obj).ReferencesOneIDs[memberMap.MemberName] = (ObjectId)obj1;
                 }
             }
         }
         // --- Added
         else
         {
             memberMap.Setter(obj, obj1);
         }
     }
     catch (Exception ex)
     {
         throw new FileFormatException(string.Format("An error occurred while deserializing the {0} {1} of class {2}: {3}", (object)memberMap.MemberName, memberMap.MemberInfo.MemberType == MemberTypes.Field ? (object)"field" : (object)"property", (object)obj.GetType().FullName, (object)ex.Message), ex);
     }
 }
        private void DeserializeExtraElement(BsonReader bsonReader, object obj, string elementName, BsonMemberMap extraElementsMemberMap)
        {
            BsonDocument bsonDocument = (BsonDocument)extraElementsMemberMap.Getter(obj);

            if (bsonDocument == (BsonDocument)null)
            {
                bsonDocument = new BsonDocument();
                extraElementsMemberMap.Setter(obj, (object)bsonDocument);
            }
            BsonValue bsonValue = BsonValue.ReadFrom(bsonReader);

            bsonDocument[elementName] = bsonValue;
        }
        public void SetDocumentId(object document, object id)
        {
            Type type = document.GetType();

            if (type.IsValueType)
            {
                throw new BsonSerializationException(string.Format("SetDocumentId cannot be used with value type {0}.", (object)type.FullName));
            }
            BsonMemberMap idMemberMap = BsonClassMap.LookupClassMap(type).IdMemberMap;

            if (idMemberMap == null)
            {
                throw new InvalidOperationException(string.Format("Class {0} has no Id member.", (object)document.GetType().FullName));
            }
            idMemberMap.Setter(document, id);
        }
 private void DeserializeMember(
     BsonReader bsonReader,
     object obj,
     BsonMemberMap memberMap
 )
 {
     var nominalType = memberMap.MemberType;
     Type actualType;
     if (bsonReader.CurrentBsonType == BsonType.Null) {
         actualType = nominalType;
     } else {
         var discriminatorConvention = BsonDefaultSerializer.LookupDiscriminatorConvention(nominalType);
         actualType = discriminatorConvention.GetActualType(bsonReader, nominalType); // returns nominalType if no discriminator found
     }
     var serializer = memberMap.GetSerializerForActualType(actualType);
     var value = serializer.Deserialize(bsonReader, nominalType, actualType, memberMap.SerializationOptions);
     memberMap.Setter(obj, value);
 }
 private void DeserializeExtraElement(
     BsonReader bsonReader,
     object obj,
     string elementName,
     BsonMemberMap extraElementsMemberMap
 )
 {
     var extraElements = (BsonDocument) extraElementsMemberMap.Getter(obj);
     if (extraElements == null) {
         extraElements = new BsonDocument();
         extraElementsMemberMap.Setter(obj, extraElements);
     }
     var value = BsonValue.ReadFrom(bsonReader);
     extraElements[elementName] = value;
 }