2017-02-20 3 views
0

私は何千ものドキュメントのコレクションを持っていますが、文書にはという名前のフィールドがあります。の問題は現在そのタイプが文字列なので、利用できないときは古い開発者は "N/A"に設定します。今のところ私はこのフィールドのタイプをC#で数値に変更したい(n/aのときに0に設定する)が、もしそうなら過去のデータをロードできない。 N/Aを0に変換するようにデシリアライズをカスタマイズできますか?カスタムデシリアライズ

+2

を見つけることができますか?もしそうなら、どのように私の質問に間違っているのか分かりますか? – kvuong

答えて

1

IBsonSerializerまたはSerializerBase<>を作成し、BsonSerializerAttributeを使用してシリアル化するプロパティに接続する必要があります。以下のような何か:

public class BsonStringNumericSerializer : SerializerBase<double> 
{ 
    public override double Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) 
    { 
     var type = context.Reader.GetCurrentBsonType(); 
     if (type == BsonType.String) 
     { 
      var s = context.Reader.ReadString(); 
      if (s.Equals("N/A", StringComparison.InvariantCultureIgnoreCase)) 
      { 
       return 0.0; 
      } 
      else 
      { 
       return double.Parse(s); 
      } 
     } 
     else if (type == BsonType.Double) 
     { 
      return context.Reader.ReadDouble(); 
     } 
     // Add any other types you need to handle 
     else 
     { 
      return 0.0; 
     } 
    } 
} 

public class YourClass 
{ 
    [BsonSerializer(typeof(BsonStringNumericSerializer))] 
    public double YourDouble { get; set; } 
} 

あなたがIBsonSerializationProviderを作成し、BsonSerializer.RegisterSerializationProviderを使用して登録することができ、属性を使用しない場合。人々はコメントせずにdownvotedなぜMongoDBのC#BSONの直列化の

完全なドキュメントはhere