2016-08-03 5 views
5

선사 전 : XML 스키마 (XSD)에서 생성 된 클래스 계층 구조 (큰 것)가 있습니다.MongoDB С # driver를 사용하여 obj.ToBsonDocument()를 호출하여 Null 값을 전역 적으로 무시하는 방법은 무엇입니까?

MyObj obj; 

요즘 : 나는 실제로 생성 된 클래스 계층 구조를 사용하여 객체에 대한 XML을 나타내는 문자열 값을 구문 분석 할 필요가 다음 나는 MongoDB를에 객체를 넣어해야합니다. 코드는 다음과 같습니다

이 문제가
private BsonDocument XmlToBson(string content) 
{ 
    MyObj obj; 
    using (var reader = new StringReader(content)) 
    { 
     var serializer = new XmlSerializer(typeof(MyObj)); 
     obj = (MyObj) serializer.Deserialize(reader); 
    } 

    return obj.ToBsonDocument(); 
} 

: 내가 널 많은 어린이가 계층 구조 개체를 가지고, 그것은 Robomongo이 모양이 :

Object which is null is added

내가 널을 추가하지 않도록 할 개체를 데이터베이스에 저장합니다. 나는 하나 또는 하나를 무시할 수 있다는 것을 알고 있습니다. 여기서는 Ignoring Default Values 속성이나 람다 식을 사용하여 설명합니다. 그러나 계층 구조가 크고 복잡하기 때문에이 방법이 마음에 들지 않습니다. 나는 그들이 null 값을 가질 때 무시되어야하는 모든 속성을 나열하는 것을 게으 르기로했다. 더욱이 클래스는 미래에 재생성 될 수 있으며 무시되어야하는 속성 목록을 지원하는 것은 악몽이 될 것입니다.

질문 : 오브젝트가 계층 구조에 상관없이 목표를 달성하고 전역 값을 전역 적으로 무시할 수 있습니까? MongoDB C# 드라이버 버전을 사용 중입니다. 2.2.

+0

어이 Antipod는 존재하지 않고 'null'값 확인으로 제거하지 않으면 무시할 수 있습니다. "삽입"하지 않거나 "자리 표시 자"로 열에 null 인 경우 다른 객체를 삽입 할 때와 같이 "무시"로 무엇을 의미합니까? –

+0

"무시"란 데이터베이스에서 그들을보고 싶지 않다는 의미입니다. 가짜 값, 즉 사용되지 않을 값을 입력하면 좋은 생각으로 들리지 않으므로 데이터베이스에 휴지통을 갖고 싶지 않습니다. 그리고 만약 무언가가 null인지 (어떻게?) 오버 헤드처럼 들리거나 아마도 당신이 의미하는 바를 이해하지 못한다. – Antipod

+0

http://stackoverflow.com/a/43259080/194717 – Tony

답변

6

규칙 팩을 등록하여 직렬화하는 동안 모든 속성에 대부분의 특성을 적용 할 수 있습니다.

아래에 IgnoreIfDefaultConvention이 등록되어 있고, 직렬화 및 비 직렬화 중에 모든 속성에 암시 적으로 [IgnoreIfDefault] 특성이 적용됩니다.

var anon = new 
{ 
    Foo = "bar", 
    Baz = (string)null, 
}; 

ConventionRegistry.Register("IgnoreIfDefault", 
          new ConventionPack { new IgnoreIfDefaultConvention(true) }, 
          t => true); 

var bsonDocument = anon.ToBsonDocument(); 

이렇게하면 Foo 키만 포함 된 문서가 생성됩니다.

이 경우 직렬화 후 Remove() 이름으로이 컨벤션 팩을 사용할 수도 있습니다.

+2

이것은 매우 우아합니다. 오랫동안 이것을 알고 싶습니다. –