ich eine Antwort haben, aber es ist nicht schön - bessere Vorschläge noch willkommen.
Wenn dieser Code vor jeder Serialisierung ausgeführt wird, serialisiert er alle angegebenen Typen als doubles. Es scheint jedoch nicht automatisch mit vom Dictionary abgeleiteten Typen zu funktionieren - sie müssen in den Konventionen einzeln enthalten sein, was fast so viel Arbeit wie das Dekorieren aller Eigenschaften mit BsonRepresentation-Attributen sein kann. Ebenso behandelt es keine Wörterbücher in anderen Wörterbüchern.
Hier ist mein Testcode:
void Main() {
var conventions = new ConventionPack();
var representAsDouble = new RepresentationSerializationOptions(BsonType.Double);
var representArrayAsDouble = new ArraySerializationOptions(representAsDouble);
var representDictionaryAsDouble = new DictionarySerializationOptions(){ KeyValuePairSerializationOptions = new KeyValuePairSerializationOptions() { ValueSerializationOptions = representArrayAsDouble}};
conventions.Add(new MemberSerializationOptionsConvention(typeof(decimal), representAsDouble));
conventions.Add(new MemberSerializationOptionsConvention(typeof(decimal[]), representArrayAsDouble));
conventions.Add(new MemberSerializationOptionsConvention(typeof(Dictionary<string, decimal[]>), representDictionaryAsDouble));
conventions.Add(new MemberSerializationOptionsConvention(typeof(SortedDictionary<string, decimal[]>), representDictionaryAsDouble));
conventions.Add(new MemberSerializationOptionsConvention(typeof(Test.DerivedDictionary), representDictionaryAsDouble));
ConventionRegistry.Register("Serialize decimal as double", conventions, t => true);
Console.WriteLine(new Test().ToJson(new JsonWriterSettings() { Indent = true }));
}
class Test : DbObject {
public Test() {
Array = new decimal[2];
Array[0] = 2;
Array[1] = 3;
Dict = new Dictionary<string, decimal[]>();
Dict["test"] = Array;
Dict2 = new SortedDictionary<string, decimal []>();
Dict2["test"] = Array;
Dict3 = new DerivedDictionary();
Dict3["test"] = Array;
Dict4 = new Dictionary<string, DerivedDictionary>();
Dict4["test"] = Dict3;
}
public decimal Field = 1;
public decimal [] Array;
public Dictionary<string, decimal[]> Dict;
public SortedDictionary<string, decimal[]> Dict2;
public DerivedDictionary Dict3;
public Dictionary<string, DerivedDictionary> Dict4;
public class DerivedDictionary : Dictionary<string, decimal[]> {
}
}
sehen, ob das hilft [vom Typ ‚System.Decimal‘ speichern als ‚String‘] (https://jira.mongodb.org/plugins/ servlet/mobile # issue/CSHARP-196) – Yev
Unabhängig von Alternativen, würde ich empfehlen, für dieses Problem zu wählen: https://jira.mongodb.org/browse/SERVER-1393 ... die vollständige Unterstützung für Dezimalzahlen in einführen würde MongoDB anstatt sich auf Speicher zu verlassen, der die Genauigkeit verlieren könnte. – WiredPrairie
OK, das habe ich gemacht. –