bson の .Net 型の原因は、辞書に型がないことです。Bson シリアライザは、ディクショナリ内のアイテムの元のオブジェクトを復元するのに十分な状態を取得しようとしています。コンテキスト (ディクショナリ) から、それらは「オブジェクト」型であるため、.Net 型が挿入され、デシリアライズ時に十分に認識されます。
次の解決策はあなたの質問に答えますが、逆シリアル化の型情報を失います。
解決策 1: 辞書の種類を次のように変更します。<string, decimal>
var dict = new Dictionary<string, decimal> {
{ "decimal", 3.503m },
{ "int", 45 }
};
var serializedString = dict.ToJson();
結果:{ "decimal" : "3.503", "int" : "45" }
10 進シリアライザーをオーバーライドすると、期待どおりの結果が得られます。
{ "decimal" : 3.503, "int" : 45 }
解決策 2: 辞書の種類を次のように変更します。<string, double>
var dict = new Dictionary<string, double> {
{ "decimal", (double)3.503m },
{ "int", 45 }
};
var serializedString = dict.ToJson();
期待される結果が得られます。{ "decimal" : 3.503, "int" : 45 }
解決策 3: カスタム シリアライザーを使用する
public class MyDictionarySerializer : SerializerBase<Dictionary<string, object>>
{
public override void Serialize(MongoDB.Bson.Serialization.BsonSerializationContext context, MongoDB.Bson.Serialization.BsonSerializationArgs args, Dictionary<string, object> dictionary)
{
context.Writer.WriteStartArray();
foreach (var item in dictionary)
{
context.Writer.WriteStartDocument();
context.Writer.WriteString(item.Key);
// TODO your converstions from object to double
var value = (double)item.Value;
context.Writer.WriteDouble(value);
context.Writer.WriteEndDocument();
}
context.Writer.WriteEndArray();
}
public override Dictionary<string, object> Deserialize(MongoDB.Bson.Serialization.BsonDeserializationContext context, MongoDB.Bson.Serialization.BsonDeserializationArgs args)
{
context.Reader.ReadStartArray();
var result = new Dictionary<string, object>();
while (true)
{
try
{
//this catch block only need to identify the end of the Array
context.Reader.ReadStartDocument();
}
catch (Exception exp)
{
context.Reader.ReadEndArray();
break;
}
var key = context.Reader.ReadString();
double value = context.Reader.ReadDouble();
result.Add(key, value);
context.Reader.ReadEndDocument();
}
return result;
}
}