programing

BsonDocument 개체를 클래스로 역직렬화하는 방법

newstyles 2023. 5. 14. 10:28

BsonDocument 개체를 클래스로 역직렬화하는 방법

BsonDocument 객체를 서버에서 가져온 후 클래스로 역직렬화하려면 어떻게 해야 합니까?

QueryDocument _document = new QueryDocument("key", "value");
MongoCursor<BsonDocument> _documentsReturned = _collection.FindAs<BsonDocument>(_document);

foreach (BsonDocument _document1 in _documentsReturned)
{
    //deserialize _document1
    //?
}

Bson Reader를 사용하여 역직렬화합니까?

실제로 세 가지 방법이 있습니다.

1.직접 로드할 유형 지정FindAs<>

var docs = _collection.FindAs<MyType>(_document);

2. 다음을 통해 문서를 역직렬화합니다.BsonSerializer:

BsonSerializer.Deserialize<MyType>(doc);

3. 수동으로 문서에 있는 bs를 클래스에 매핑합니다.

var myClass = new Mytype();
myClass.Name = bsonDoc["name"].AsString;

대부분의 경우 첫 번째 접근 방식을 사용해도 괜찮습니다.그러나 문서가 구조화되지 않은 경우에는 세 번째 접근 방식이 필요할 수 있습니다.

구조화된 데이터가 있는 대형 응용프로그램의 경우 BsonDocument를 사용하는 대신 사용자 정의 모델을 사용하여 데이터를 만들고 가져오는 것이 좋습니다.

모델을 만드는 것은 역직렬화의 중요한 단계입니다.

모델을 만드는 동안 기억해야 할 유용한 주석:

  • 더하다id모델의 속성.사용해 보십시오.[BsonId]모범 사례의 속성:
  • 다음과 같이 주석을 사용하여 속성 만들기[BsonExtraElements]역직렬화 중에 발견된 추가 요소를 고정하는 데 사용됩니다.
  • 사용할 수 있습니다.[BsonElement]요소Name을(를) 지정합니다.
  • [BsonIgnoreIfDefault]BsonIgnoreIfDefaultAttribute 클래스의 새 인스턴스를 초기화합니다.

샘플 모델 구조, 최대 사례를 다루려고 했습니다.더 나은 아키텍처를 위해 _id 속성에 대한 기본 클래스를 만들었지만 에서 직접 사용할 수 있습니다.MyModel수업도 마찬가지야.

    public abstract class BaseEntity
    {
        // if you'd like to delegate another property to map onto _id then you can decorate it with the BsonIdAttribute, like this
        [BsonId]
        public string id { get; set; }
    }

    public class MyModel: BaseEntity
    {
        [BsonElement("PopulationAsOn")]
        public DateTime? PopulationAsOn { get; set; }
    
        [BsonRepresentation(BsonType.String)]
        [BsonElement("CountryId")]
        public int CountryId { get; set; }

        [Required(AllowEmptyStrings = false)]
        [StringLength(5)]
        [BsonIgnoreIfDefault]
        public virtual string CountryCode { get; set; }

        [BsonIgnoreIfDefault]
        public IList<States> States { get; set; }

        [BsonExtraElements]
        public BsonDocument ExtraElements { get; set; }
    }

이제 Deserialise로 전화하는 동안 모델을 직접 사용하십시오.FindAsync다음과 같이:

cursor = await _collection.FindAsync(filter, 
new FindOptions<MyModel, MyModel>() 
{ BatchSize = 1000, Sort = sort }, ct);

언급URL : https://stackoverflow.com/questions/9478613/how-to-deserialize-a-bsondocument-object-back-to-class