/* Copyright 2017-present MongoDB Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using System.Collections.Generic; using System.Linq; using MongoDB.Bson.IO; namespace MongoDB.Bson.Serialization.Serializers { /// /// A serializer that serializes a document and appends elements to the end of it. /// /// The type of the document. /// public class ElementAppendingSerializer : IBsonSerializer { // private fields private readonly IBsonSerializer _documentSerializer; private readonly List _elements; private readonly Action _writerSettingsConfigurator; // constructors /// /// Initializes a new instance of the class. /// /// The document serializer. /// The elements to append. /// The writer settings configurator. public ElementAppendingSerializer( IBsonSerializer documentSerializer, IEnumerable elements, Action writerSettingsConfigurator = null) { if (documentSerializer == null) { throw new ArgumentNullException(nameof(documentSerializer)); } if (elements == null) { throw new ArgumentNullException(nameof(elements)); } _documentSerializer = documentSerializer; _elements = elements.ToList(); _writerSettingsConfigurator = writerSettingsConfigurator; // can be null } // public properties /// public Type ValueType => typeof(TDocument); // public methods /// public TDocument Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) { throw new NotSupportedException(); } object IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) { throw new NotSupportedException(); } /// public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TDocument value) { var writer = context.Writer; var elementAppendingWriter = new ElementAppendingBsonWriter(writer, _elements, _writerSettingsConfigurator); var elementAppendingContext = BsonSerializationContext.CreateRoot(elementAppendingWriter, builder => ConfigureElementAppendingContext(builder, context)); _documentSerializer.Serialize(elementAppendingContext, args, value); } void IBsonSerializer.Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value) { Serialize(context, args, (TDocument)value); } // private methods private void ConfigureElementAppendingContext(BsonSerializationContext.Builder builder, BsonSerializationContext originalContext) { builder.IsDynamicType = originalContext.IsDynamicType; } } }