首页 新闻 会员 周边

.NET: MongoDB.Bson 序列化问题

0
悬赏园豆:30 [已解决问题] 解决于 2024-02-23 12:00

使用 MongoDB.Bson 序列化对象时遇到了问题,直接对实例序列化正常,转换为 object 实例化失败,示例代码如下

using MongoDB.Bson;

TestData dt = new();
var bson = dt.ToBson(); // 可以正常序列化
Console.WriteLine(bson.Length);

object obj = dt;
bson = obj.ToBson(); // 抛异常
Console.WriteLine(bson.Length);

public class TestData
{
    public string FieldA;
    public string FieldB;
}

异常信息

MongoDB.Bson.BsonSerializationException: Type TestData is not configured as a type that is allowed to be serialized for this instance of ObjectSerializer.
dudu的主页 dudu | 高人七级 | 园豆:31048
提问于:2024-02-23 11:36
< >
分享
最佳答案
0

在 stackoverflow 上的一个回答中找到解决方法

var objectSerializer = new ObjectSerializer(ObjectSerializer.AllAllowedTypes);
BsonSerializer.RegisterSerializer(objectSerializer);

上面代码中的注册是全局的,注册后 ToBson 就支持所有允许的类型,完整示例代码如下

using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Serializers;

TestData dt = new() { FieldA = "A" };
var bson = dt.ToBson(); 
Console.WriteLine(bson.Length); // output: 27
Console.WriteLine(BsonSerializer.Deserialize<TestData>(bson).FieldA);

var objectSerializer = new ObjectSerializer(ObjectSerializer.AllAllowedTypes);
BsonSerializer.RegisterSerializer(objectSerializer);
object obj = dt;
bson = obj.ToBson(); 
Console.WriteLine(bson.Length); // output: 44
Console.WriteLine(BsonSerializer.Deserialize<TestData>(bson).FieldA);
Console.WriteLine(((TestData)BsonSerializer.Deserialize<object>(bson)).FieldA);

public class TestData
{
    public string FieldA;
    public string FieldB;
}
dudu | 高人七级 |园豆:31048 | 2024-02-23 12:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册