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; }