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