/* Copyright 2010-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 MongoDB.Bson.IO; using MongoDB.Bson.Serialization.Conventions; namespace MongoDB.Bson.Serialization.Serializers { /// /// Represents an abstract base class for serializers. /// /// The type of the value. public abstract class SerializerBase : IBsonSerializer { // public properties /// /// Gets the type of the values. /// /// /// The type of the values. /// public Type ValueType { get { return typeof(TValue); } } // public methods /// /// Deserializes a value. /// /// The deserialization context. /// The deserialization args. /// A deserialized value. public virtual TValue Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) { throw CreateCannotBeDeserializedException(); } /// /// Serializes a value. /// /// The serialization context. /// The serialization args. /// The value. public virtual void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TValue value) { throw CreateCannotBeSerializedException(); } // protected methods /// /// Creates an exception to throw when a type cannot be deserialized. /// /// An exception. protected Exception CreateCannotBeDeserializedException() { var message = string.Format( "Values of type '{0}' cannot be deserialized using a serializer of type '{1}'.", BsonUtils.GetFriendlyTypeName(typeof(TValue)), BsonUtils.GetFriendlyTypeName(GetType())); return new NotSupportedException(message); } /// /// Creates an exception to throw when a type cannot be deserialized. /// /// An exception. protected Exception CreateCannotBeSerializedException() { var message = string.Format( "Values of type '{0}' cannot be serialized using a serializer of type '{1}'.", BsonUtils.GetFriendlyTypeName(typeof(TValue)), BsonUtils.GetFriendlyTypeName(GetType())); return new NotSupportedException(message); } /// /// Creates an exception to throw when a type cannot be deserialized from a BsonType. /// /// The BSON type. /// An exception. protected Exception CreateCannotDeserializeFromBsonTypeException(BsonType bsonType) { var message = string.Format("Cannot deserialize a '{0}' from BsonType '{1}'.", BsonUtils.GetFriendlyTypeName(ValueType), bsonType); return new FormatException(message); } /// /// Ensures that the BsonType equals the expected type. /// /// The reader. /// The expected type. protected void EnsureBsonTypeEquals(IBsonReader reader, BsonType bsonType) { if (reader.GetCurrentBsonType() != bsonType) { throw CreateCannotDeserializeFromBsonTypeException(reader.GetCurrentBsonType()); } } // explicit interface implementations object IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) { return Deserialize(context, args); } void IBsonSerializer.Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value) { Serialize(context, args, (TValue)value); } } }