Пример #1
0
        // protected methods
        /// <summary>
        /// Deserializes a value.
        /// </summary>
        /// <param name="context">The deserialization context.</param>
        /// <returns>The value.</returns>
        protected override MongoDBRef DeserializeValue(BsonDeserializationContext context)
        {
            var bsonReader = context.Reader;

            string    databaseName   = null;
            string    collectionName = null;
            BsonValue id             = null;

            _helper.DeserializeMembers(context, (elementName, flag) =>
            {
                switch (flag)
                {
                case Flags.CollectionName: collectionName = bsonReader.ReadString(); break;

                case Flags.Id:  id = context.DeserializeWithChildContext(BsonValueSerializer.Instance); break;

                case Flags.DatabaseName:  databaseName = bsonReader.ReadString(); break;
                }
            });

            return(new MongoDBRef(databaseName, collectionName, id));
        }
Пример #2
0
        // public methods
        /// <summary>
        /// Deserializes a value.
        /// </summary>
        /// <param name="context">The deserialization context.</param>
        /// <returns>An object.</returns>
        public override TValue Deserialize(BsonDeserializationContext context)
        {
            var bsonReader = context.Reader;

            var bsonType = bsonReader.GetCurrentBsonType();

            switch (bsonType)
            {
            case BsonType.Null:
                bsonReader.ReadNull();
                return(null);

            case BsonType.Array:
                bsonReader.ReadStartArray();
                var accumulator = CreateAccumulator();
                while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
                {
                    var item = context.DeserializeWithChildContext(_itemSerializer);
                    AddItem(accumulator, item);
                }
                bsonReader.ReadEndArray();
                return(FinalizeResult(accumulator));

            case BsonType.Document:
                var serializer = new DiscriminatedWrapperSerializer <TValue>(_discriminatorConvention, this);
                if (serializer.IsPositionedAtDiscriminatedWrapper(context))
                {
                    return((TValue)serializer.Deserialize(context));
                }
                else
                {
                    goto default;
                }

            default:
                throw CreateCannotDeserializeFromBsonTypeException(bsonType);
            }
        }
        // methods
        public override TValue Deserialize(BsonDeserializationContext context)
        {
            TValue value = default(TValue);

            var reader = context.Reader;

            reader.ReadStartDocument();
            while (reader.ReadBsonType() != 0)
            {
                var elementName = reader.ReadName();
                if (elementName == _elementName && (reader.CurrentBsonType != BsonType.Null || _deserializeNull))
                {
                    value = context.DeserializeWithChildContext <TValue>(_valueSerializer);
                }
                else
                {
                    reader.SkipValue();
                }
            }
            reader.ReadEndDocument();

            return(value);
        }
        // public methods
        /// <summary>
        /// Deserializes a value.
        /// </summary>
        /// <param name="context">The deserialization context.</param>
        /// <returns>An object.</returns>
        public override DateTime Deserialize(BsonDeserializationContext context)
        {
            var      bsonReader = context.Reader;
            DateTime value;

            var bsonType = bsonReader.GetCurrentBsonType();

            switch (bsonType)
            {
            case BsonType.DateTime:
                // use an intermediate BsonDateTime so MinValue and MaxValue are handled correctly
                value = new BsonDateTime(bsonReader.ReadDateTime()).ToUniversalTime();
                break;

            case BsonType.Document:
                value = default(DateTime);
                _helper.DeserializeMembers(context, (elementName, flag) =>
                {
                    switch (flag)
                    {
                    case Flags.DateTime: bsonReader.SkipValue(); break;         // ignore value (use Ticks instead)

                    case Flags.Ticks: value = new DateTime(context.DeserializeWithChildContext(_int64Serializer), DateTimeKind.Utc); break;
                    }
                });
                break;

            case BsonType.Int64:
                value = DateTime.SpecifyKind(new DateTime(bsonReader.ReadInt64()), DateTimeKind.Utc);
                break;

            case BsonType.String:
                // note: we're not using XmlConvert because of bugs in Mono
                if (_dateOnly)
                {
                    value = DateTime.SpecifyKind(DateTime.ParseExact(bsonReader.ReadString(), "yyyy-MM-dd", null), DateTimeKind.Utc);
                }
                else
                {
                    var formats = new string[] { "yyyy-MM-ddK", "yyyy-MM-ddTHH:mm:ssK", "yyyy-MM-ddTHH:mm:ss.FFFFFFFK" };
                    value = DateTime.ParseExact(bsonReader.ReadString(), formats, null, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal);
                }
                break;

            default:
                throw CreateCannotDeserializeFromBsonTypeException(bsonType);
            }

            if (_dateOnly)
            {
                if (value.TimeOfDay != TimeSpan.Zero)
                {
                    throw new FileFormatException("TimeOfDay component for DateOnly DateTime value is not zero.");
                }
                value = DateTime.SpecifyKind(value, _kind); // not ToLocalTime or ToUniversalTime!
            }
            else
            {
                switch (_kind)
                {
                case DateTimeKind.Local:
                case DateTimeKind.Unspecified:
                    value = DateTime.SpecifyKind(BsonUtils.ToLocalTime(value), _kind);
                    break;

                case DateTimeKind.Utc:
                    value = BsonUtils.ToUniversalTime(value);
                    break;
                }
            }

            return(value);
        }
Пример #5
0
 // private methods
 private GeoJsonLineStringCoordinates <TCoordinates> DeserializeCoordinates(BsonDeserializationContext context)
 {
     return(context.DeserializeWithChildContext(_coordinatesSerializer));
 }
Пример #6
0
 private GeoJsonCoordinateReferenceSystem DeserializeCoordinateReferenceSystem(BsonDeserializationContext context)
 {
     return(context.DeserializeWithChildContext(_coordinateReferenceSystemSerializer));
 }
Пример #7
0
 // private methods
 private GeoJsonBoundingBox <TCoordinates> DeserializeBoundingBox(BsonDeserializationContext context)
 {
     return(context.DeserializeWithChildContext(_boundingBoxSerializer));
 }
Пример #8
0
 private BsonValue DeserializeId(BsonDeserializationContext context)
 {
     return(context.DeserializeWithChildContext(BsonValueSerializer.Instance));
 }
Пример #9
0
 // private methods
 private GeoJsonGeometry <TCoordinates> DeserializeGeometry(BsonDeserializationContext context)
 {
     return(context.DeserializeWithChildContext(_geometrySerializer));
 }
Пример #10
0
 private BsonDocument DeserializeProperties(BsonDeserializationContext context)
 {
     return(context.DeserializeWithChildContext(BsonDocumentSerializer.Instance));
 }
Пример #11
0
 // methods
 public override TResult Deserialize(BsonDeserializationContext context)
 {
     return(context.DeserializeWithChildContext <TResult>(_resultSerializer));
 }
Пример #12
0
 // private methods
 private TCoordinates DeserializeCoordinates(BsonDeserializationContext context)
 {
     return(context.DeserializeWithChildContext(_coordinatesSerializer));
 }