/* Copyright 2010-2014 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.Collections.Generic; using System.Dynamic; namespace MongoDB.Bson.Serialization.Serializers { /// /// Serializer for . /// /// /// The use of will serialize any without type information. /// To get the best experience out of using an , any member wanting to be used /// as an array should use . /// public class ExpandoObjectSerializer : DynamicDocumentBaseSerializer { // private fields private readonly IBsonSerializer> _listSerializer; /// /// Initializes a new instance of the class. /// public ExpandoObjectSerializer() { _listSerializer = BsonSerializer.LookupSerializer>(); } /// /// Configures the deserialization context. /// /// The builder. protected override void ConfigureDeserializationContext(BsonDeserializationContext.Builder builder) { builder.DynamicDocumentSerializer = this; builder.DynamicArraySerializer = _listSerializer; } /// /// Configures the serialization context. /// /// The builder. protected override void ConfigureSerializationContext(BsonSerializationContext.Builder builder) { builder.IsDynamicType = t => t == typeof(ExpandoObject) || t == typeof(List); } /// /// Creates the document. /// /// /// A . /// protected override ExpandoObject CreateDocument() { return new ExpandoObject(); } /// /// Sets the value for the member. /// /// The document. /// Name of the member. /// The value. protected override void SetValueForMember(ExpandoObject document, string memberName, object value) { ((IDictionary)document)[memberName] = value; } /// /// Tries to get the value for a member. Returns true if the member should be serialized. /// /// The value. /// Name of the member. /// The member value. /// true if the member should be serialized; otherwise false. protected override bool TryGetValueForMember(ExpandoObject value, string memberName, out object memberValue) { return ((IDictionary)value).TryGetValue(memberName, out memberValue); } } }