C# MongoDB BsonDocument 未使用 BsonSerializer 序列化为自定义 class
C# MongoDB BsonDocument not getting serialized to custom class using BsonSerializer
我在使用 BsonSerializer 序列化 BsonDocuments 时遇到问题。
我正在使用 var bsonDoc = collection.Find(...)
从 MongoDB 数据库中提取单个文档。
然后我尝试使用序列化它
var strongTypedDocument = BsonSerializer.Deserialize<MainSDocument>(bsonDoc);
这是 BsonDocument
{
"MainSPayload" :
{
"GDeets" : { "Id" : 0, "GSerial" : "XX123XX123" }
}
}
这是 C# classes
[JsonObject(MemberSerialization.OptIn)]
[BsonIgnoreExtraElements]
public class MainSDocument
{
[JsonProperty(Required = Required.Always)]
public MainState MainSPayload
{
get; set;
}
}
[JsonObject(MemberSerialization.OptIn)]
public class MainState
{
[JsonProperty(Required = Required.Always)]
public GDetails GDeets
{
get; set;
}
}
public class GDetails
{
public int Id
{
get; set;
}
public string GSerial
{
get; set;
}
}
我得到的错误是:FormatException: An error occurred while deserializing the GDetails property of class MainState : Element 'Id' does not match any field or property of class GDetails .'
为什么会这样?为什么元素 Id
与 GDetails
class 中的 int 元素 Id
不匹配?
Id
字段的序列化有一个特殊的工作流程,可以有效地将此值转换为服务器端表示它的方式:_id
。要解决此问题,您可以使用:
BsonClassMap.RegisterClassMap<GDetails>(c =>
{
c.AutoMap();
c.UnmapField(u => u.Id); // remove default _id workflow
c.MapField(u => u.Id); // add a simple Id field
});
或更简单:
BsonClassMap.RegisterClassMap<GDetails>(c =>
{
c.AutoMap();
c.SetIdMember(null);
});
更新:
有一种更灵活的方法。您可以配置一个新约定并设置您需要使用它的类型:
var customPack = new ConventionPack();
customPack.Add(new NoIdMemberConvention());
ConventionRegistry.Register("NoIdConvention", customPack, t => t == typeof(GDetails));
也可以将 BsonNoId 属性添加到 class:
[BsonNoId]
public class GDetails
{
public int Id
{
get; set;
}
public string GSerial
{
get; set;
}
}
我在使用 BsonSerializer 序列化 BsonDocuments 时遇到问题。
我正在使用 var bsonDoc = collection.Find(...)
从 MongoDB 数据库中提取单个文档。
然后我尝试使用序列化它
var strongTypedDocument = BsonSerializer.Deserialize<MainSDocument>(bsonDoc);
这是 BsonDocument
{
"MainSPayload" :
{
"GDeets" : { "Id" : 0, "GSerial" : "XX123XX123" }
}
}
这是 C# classes
[JsonObject(MemberSerialization.OptIn)]
[BsonIgnoreExtraElements]
public class MainSDocument
{
[JsonProperty(Required = Required.Always)]
public MainState MainSPayload
{
get; set;
}
}
[JsonObject(MemberSerialization.OptIn)]
public class MainState
{
[JsonProperty(Required = Required.Always)]
public GDetails GDeets
{
get; set;
}
}
public class GDetails
{
public int Id
{
get; set;
}
public string GSerial
{
get; set;
}
}
我得到的错误是:FormatException: An error occurred while deserializing the GDetails property of class MainState : Element 'Id' does not match any field or property of class GDetails .'
为什么会这样?为什么元素 Id
与 GDetails
class 中的 int 元素 Id
不匹配?
Id
字段的序列化有一个特殊的工作流程,可以有效地将此值转换为服务器端表示它的方式:_id
。要解决此问题,您可以使用:
BsonClassMap.RegisterClassMap<GDetails>(c =>
{
c.AutoMap();
c.UnmapField(u => u.Id); // remove default _id workflow
c.MapField(u => u.Id); // add a simple Id field
});
或更简单:
BsonClassMap.RegisterClassMap<GDetails>(c =>
{
c.AutoMap();
c.SetIdMember(null);
});
更新: 有一种更灵活的方法。您可以配置一个新约定并设置您需要使用它的类型:
var customPack = new ConventionPack();
customPack.Add(new NoIdMemberConvention());
ConventionRegistry.Register("NoIdConvention", customPack, t => t == typeof(GDetails));
也可以将 BsonNoId 属性添加到 class:
[BsonNoId]
public class GDetails
{
public int Id
{
get; set;
}
public string GSerial
{
get; set;
}
}