diff --git a/LiteDB/Client/Mapper/BsonMapper.Deserialize.cs b/LiteDB/Client/Mapper/BsonMapper.Deserialize.cs index d2e23943b..3b6c474dd 100644 --- a/LiteDB/Client/Mapper/BsonMapper.Deserialize.cs +++ b/LiteDB/Client/Mapper/BsonMapper.Deserialize.cs @@ -165,7 +165,7 @@ public object Deserialize(Type type, BsonValue value) var doc = value.AsDocument; // test if value is object and has _type - if (doc.TryGetValue("_type", out var typeField) && typeField.IsString) + if (doc.TryGetValue(BsonMapper.Global.TypeDescriptor, out var typeField) && typeField.IsString) { type = _typeNameBinder.GetType(typeField.AsString); diff --git a/LiteDB/Client/Mapper/BsonMapper.Serialize.cs b/LiteDB/Client/Mapper/BsonMapper.Serialize.cs index 1e013b16c..ffcafa3c1 100644 --- a/LiteDB/Client/Mapper/BsonMapper.Serialize.cs +++ b/LiteDB/Client/Mapper/BsonMapper.Serialize.cs @@ -185,7 +185,7 @@ private BsonDocument SerializeObject(Type type, object obj, int depth) // adding _type only where property Type is not same as object instance type if (type != t) { - doc["_type"] = new BsonValue(_typeNameBinder.GetName(t)); + doc[BsonMapper.Global.TypeDescriptor] = new BsonValue(_typeNameBinder.GetName(t)); } foreach (var member in entity.Members.Where(x => x.Getter != null)) @@ -194,6 +194,7 @@ private BsonDocument SerializeObject(Type type, object obj, int depth) var value = member.Getter(obj); if (value == null && this.SerializeNullValues == false && member.FieldName != "_id") continue; + // Console.WriteLine(member.FieldName + " " + member.DataType.Name); // if member has a custom serialization, use it if (member.Serialize != null) diff --git a/LiteDB/Client/Mapper/BsonMapper.cs b/LiteDB/Client/Mapper/BsonMapper.cs index 304902b58..ebfcb9dd9 100644 --- a/LiteDB/Client/Mapper/BsonMapper.cs +++ b/LiteDB/Client/Mapper/BsonMapper.cs @@ -94,6 +94,8 @@ public partial class BsonMapper /// public int MaxDepth { get; set; } + public string TypeDescriptor { get; set; } + /// /// A custom callback to change MemberInfo behavior when converting to MemberMapper. /// Use mapper.ResolveMember(Type entity, MemberInfo property, MemberMapper documentMappedField) @@ -119,6 +121,7 @@ public BsonMapper(Func customTypeInstantiator = null, ITypeNameBin this.ResolveCollectionName = (t) => Reflection.IsEnumerable(t) ? Reflection.GetListItemType(t).Name : t.Name; this.IncludeFields = false; this.MaxDepth = 20; + this.TypeDescriptor = "_type"; _typeInstantiator = customTypeInstantiator ?? ((Type t) => null); _typeNameBinder = typeNameBinder ?? DefaultTypeNameBinder.Instance; @@ -524,7 +527,7 @@ private static void RegisterDbRefItem(BsonMapper mapper, MemberMapper member, IT doc["_id"] = idRef; if (doc.ContainsKey("$type")) { - doc["_type"] = bson["$type"]; + doc[BsonMapper.Global.TypeDescriptor] = bson["$type"]; } return m.Deserialize(entity.ForType, doc); @@ -534,7 +537,7 @@ private static void RegisterDbRefItem(BsonMapper mapper, MemberMapper member, IT { return m.Deserialize(entity.ForType, doc.ContainsKey("$type") ? - new BsonDocument { ["_id"] = idRef, ["_type"] = bson["$type"] } : + new BsonDocument { ["_id"] = idRef, [BsonMapper.Global.TypeDescriptor] = bson["$type"] } : new BsonDocument { ["_id"] = idRef }); // if has $id, deserialize object using only _id object } @@ -609,7 +612,7 @@ private static void RegisterDbRefList(BsonMapper mapper, MemberMapper member, IT item["_id"] = idRef; if (item.AsDocument.ContainsKey("$type")) { - item["_type"] = item["$type"]; + item[BsonMapper.Global.TypeDescriptor] = item["$type"]; } result.Add(item); @@ -620,7 +623,7 @@ private static void RegisterDbRefList(BsonMapper mapper, MemberMapper member, IT if (item.AsDocument.ContainsKey("$type")) { - bsonDocument["_type"] = item["$type"]; + bsonDocument[BsonMapper.Global.TypeDescriptor] = item["$type"]; } result.Add(bsonDocument);