Skip to content

[Question] DateTimeOffset? protobuf serialization/deserialization in ASP Core #226

@odysseus1973

Description

@odysseus1973

Hi!

After some investigation and reading posts on SO I found two ways to serialize DateTimeOffset?

  1. Shim properties (working, but does not fit in my case)
  2. 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?

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions