/// <summary> /// Serializes an object to a BsonWriter. /// </summary> /// <param name="bsonWriter">The BsonWriter.</param> /// <param name="nominalType">The nominal type.</param> /// <param name="value">The object.</param> /// <param name="options">The serialization options.</param> public override void Serialize( BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options) { if (value == null) { bsonWriter.WriteNull(); } else { var bsonDateTime = (BsonDateTime)value; var dateTimeSerializationOptions = EnsureSerializationOptions<DateTimeSerializationOptions>(options); DateTime utcDateTime = DateTime.MinValue; long millisecondsSinceEpoch; if (dateTimeSerializationOptions.DateOnly) { if (bsonDateTime.Value.TimeOfDay != TimeSpan.Zero) { throw new BsonSerializationException("TimeOfDay component is not zero."); } utcDateTime = DateTime.SpecifyKind(bsonDateTime.Value, DateTimeKind.Utc); // not ToLocalTime millisecondsSinceEpoch = BsonUtils.ToMillisecondsSinceEpoch(utcDateTime); } else { if (bsonDateTime.IsValidDateTime) { utcDateTime = BsonUtils.ToUniversalTime(bsonDateTime.Value); } millisecondsSinceEpoch = bsonDateTime.MillisecondsSinceEpoch; } switch (dateTimeSerializationOptions.Representation) { case BsonType.DateTime: bsonWriter.WriteDateTime(millisecondsSinceEpoch); break; case BsonType.Document: bsonWriter.WriteStartDocument(); bsonWriter.WriteDateTime("DateTime", millisecondsSinceEpoch); if (bsonDateTime.IsValidDateTime) { bsonWriter.WriteInt64("Ticks", utcDateTime.Ticks); } else { bsonWriter.WriteUndefined("Ticks"); } bsonWriter.WriteEndDocument(); break; case BsonType.Int64: if (bsonDateTime.IsValidDateTime) { bsonWriter.WriteInt64(utcDateTime.Ticks); } else { throw new BsonSerializationException("BsonDateTime is not a valid DateTime."); } break; case BsonType.String: if (dateTimeSerializationOptions.DateOnly) { bsonWriter.WriteString(bsonDateTime.Value.ToString("yyyy-MM-dd")); } else { // we're not using XmlConvert.ToString because of bugs in Mono var dateTime = bsonDateTime.Value; if (dateTime == DateTime.MinValue || dateTime == DateTime.MaxValue) { // serialize MinValue and MaxValue as Unspecified so we do NOT get the time zone offset dateTime = DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified); } else if (dateTime.Kind == DateTimeKind.Unspecified) { // serialize Unspecified as Local se we get the time zone offset dateTime = DateTime.SpecifyKind(dateTime, DateTimeKind.Local); } bsonWriter.WriteString(dateTime.ToString("yyyy-MM-ddTHH:mm:ss.FFFFFFFK")); } break; default: var message = string.Format("'{0}' is not a valid DateTime representation.", dateTimeSerializationOptions.Representation); throw new BsonSerializationException(message); } } }
/// <summary> /// Serializes an object to a BsonWriter. /// </summary> /// <param name="bsonWriter">The BsonWriter.</param> /// <param name="nominalType">The nominal type.</param> /// <param name="value">The object.</param> /// <param name="options">The serialization options.</param> public override void Serialize( BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options) { if (value == null) { throw new ArgumentNullException("value"); } bsonWriter.WriteUndefined(); }
/// <summary> /// Serializes an object to a BsonWriter. /// </summary> /// <param name="bsonWriter">The BsonWriter.</param> /// <param name="nominalType">The nominal type.</param> /// <param name="value">The object.</param> /// <param name="options">The serialization options.</param> public override void Serialize( BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options) { if (value == null) { bsonWriter.WriteNull(); } else { bsonWriter.WriteUndefined(); } }