你绝对可以做到这一点,你只需要把握好时机。当驱动程序启动时,没有注册序列化程序。当它需要一个序列化器时,它会在字典中查找它,它会跟踪它知道的序列化器(即那些已经注册的序列化器)。只有它无法在字典中找到一个,它才会开始找出从哪里获得一个(包括调用序列化提供程序),如果找到一个,它就会注册它。
RegisterSerializer 存在限制,因此您无法替换已使用的现有序列化程序。但这并不意味着如果你足够早地注册,你就不能注册自己的。
但是,请记住,注册序列化程序是一项全局操作,因此如果您为 double 注册自定义序列化程序,它将用于所有双精度数,这可能会导致意外结果!
无论如何,您可以像这样编写自定义序列化程序:
public class CustomDoubleSerializer : BsonBaseSerializer
{
public override object Deserialize(BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options)
{
var rep = bsonReader.ReadInt64();
return rep / 100.0;
}
public override void Serialize(BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options)
{
var rep = (long)((double)value * 100);
bsonWriter.WriteInt64(rep);
}
}
并像这样注册它:
BsonSerializer.RegisterSerializer(typeof(double), new CustomDoubleSerializer());
您可以使用以下类对其进行测试:
public class C
{
public int Id;
public double X;
}
这个代码:
BsonSerializer.RegisterSerializer(typeof(double), new CustomDoubleSerializer());
var c = new C { Id = 1, X = 29.99 };
var json = c.ToJson();
Console.WriteLine(json);
var r = BsonSerializer.Deserialize<C>(json);
Console.WriteLine(r.X);