-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Open
Labels
Description
Hi!
After some investigation and reading posts on SO I found two ways to serialize DateTimeOffset?
- Shim properties (working, but does not fit in my case)
- Surrogates. Not working in my case
In my StartUp file I use
RuntimeTypeModel.Default.Add(typeof(DateTimeOffset),false).SetSurrogate(typeof(DateTimeOffsetSurrogate));
RuntimeTypeModel.Default.Add(typeof(DateTimeOffset?),false).SetSurrogate(typeof(DateTimeOffsetSurrogate));
My surrogate class
[ProtoContract]
public class DateTimeOffsetSurrogate
{
[ProtoMember(1)]
public string Date { get; set; }
//public static implicit operator DateTimeOffsetSurrogate(DateTimeOffset? value)
//{
// return (value.HasValue) ? new DateTimeOffsetSurrogate { Date = value.Value.ToString("o") } : new DateTimeOffsetSurrogate { Date = null };
//}
//public static implicit operator DateTimeOffset? (DateTimeOffsetSurrogate value)
//{
// DateTimeOffset? result = null;
// if (DateTimeOffset.TryParse(value.Date, out DateTimeOffset date))
// {
// result = date;
// }
// return result;
//}
public static implicit operator DateTimeOffsetSurrogate(DateTimeOffset value)
{
return (value != null) ? new DateTimeOffsetSurrogate { Date = value.ToString("o") } : new DateTimeOffsetSurrogate { Date = null };
}
public static implicit operator DateTimeOffset(DateTimeOffsetSurrogate value)
{
// DateTimeOffset? result = null;
// if (
DateTimeOffset.TryParse(value.Date, out DateTimeOffset date);
//{
// result = date;
//}
return date;
}
}
My serialized class
[ProtoContract]
public class StocksDto
{
[JsonIgnore]
public Guid? StoreId { get; set; }
[Required]
public DateTimeOffset? Date { get; set; }
[JsonIgnore]
public DateTime DateUtc { get { return Date.HasValue ? Date.Value.UtcDateTime : DateTime.MinValue; } }
[JsonIgnore]
public double TimeZoneOffset { get { return Date.HasValue ? Date.Value.Offset.TotalMinutes : 0; } }
[ProtoMember(1)]
[Required]
public bool? Full { get; set; }
[HasElements(ErrorMessage = "The field Stocks must contain non-empty array of elements")]
[ProtoMember(2)]
public IEnumerable<Stock> Stocks { get; set; }
}
When I try serialize/deserialize StocksDto, Date property return no value (null). As I can see implicit operator in surrogate does not called.
How to use surrogate for DateTimeOffset? in my case?