あなたは間違いなくこれを行うことができます、あなたはただタイミングを正しくする必要があります。ドライバが起動すると、シリアライザは登録されません。シリアライザーが必要な場合は、辞書で検索し、認識しているシリアライザー(つまり、登録されているシリアライザー)を追跡します。辞書で1つが見つからない場合にのみ、どこで入手できるか(シリアル化プロバイダーの呼び出しを含む)を見つけ出し、見つかった場合は登録します。
RegisterSerializerには制限があるため、すでに使用されている既存のシリアライザーを置き換えることはできません。しかし、それはあなたが十分に早くそれをするならばあなたがあなた自身を登録することができないという意味ではありません。
ただし、シリアライザーの登録はグローバル操作であることに注意してください。したがって、doubleのカスタムシリアライザーを登録すると、すべての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);