public override int Serialize(TSource source, SerializationContext context) { ulong value = GetValue(source); if (IsOptional && value == DefaultValue) { return(0); } return(WritePrefix(context) + context.EncodeUInt64(value)); }
internal static int SerializeTimeSpan(TimeSpan timeSpan, SerializationContext context, bool lengthPrefixed) { TimeSpanScale scale; long value = timeSpan.Ticks; if (timeSpan == TimeSpan.MaxValue) { value = 1; scale = TimeSpanScale.MinMax; } else if (timeSpan == TimeSpan.MinValue) { value = -1; scale = TimeSpanScale.MinMax; } else if (value % TimeSpan.TicksPerDay == 0) { scale = TimeSpanScale.Days; value /= TimeSpan.TicksPerDay; } else if (value % TimeSpan.TicksPerHour == 0) { scale = TimeSpanScale.Hours; value /= TimeSpan.TicksPerHour; } else if (value % TimeSpan.TicksPerMinute == 0) { scale = TimeSpanScale.Minutes; value /= TimeSpan.TicksPerMinute; } else if (value % TimeSpan.TicksPerSecond == 0) { scale = TimeSpanScale.Seconds; value /= TimeSpan.TicksPerSecond; } else if (value % TimeSpan.TicksPerMillisecond == 0) { scale = TimeSpanScale.Milliseconds; value /= TimeSpan.TicksPerMillisecond; } else { scale = TimeSpanScale.Ticks; } int len = 0; ulong zig = SerializationContext.Zig(value); if (lengthPrefixed) { if (scale != TimeSpanScale.Days) { len += 2; } if (zig != 0) { len += 1 + SerializationContext.GetLength(zig); } context.WriteByte((byte)len); len = 1; } if (value != 0) { context.WriteByte((FieldTimeSpanValue << 3) | (int)WireType.Variant); len += 1 + context.EncodeUInt64(zig); } if (scale != TimeSpanScale.Days) { context.WriteByte((FieldTimeSpanScale << 3) | (int)WireType.Variant); len += 1 + context.EncodeInt32((int)scale); } return len; }
internal static int SerializeTimeSpan(TimeSpan timeSpan, SerializationContext context, bool lengthPrefixed) { TimeSpanScale scale; long value = timeSpan.Ticks; if (timeSpan == TimeSpan.MaxValue) { value = 1; scale = TimeSpanScale.MinMax; } else if (timeSpan == TimeSpan.MinValue) { value = -1; scale = TimeSpanScale.MinMax; } else if (value % TimeSpan.TicksPerDay == 0) { scale = TimeSpanScale.Days; value /= TimeSpan.TicksPerDay; } else if (value % TimeSpan.TicksPerHour == 0) { scale = TimeSpanScale.Hours; value /= TimeSpan.TicksPerHour; } else if (value % TimeSpan.TicksPerMinute == 0) { scale = TimeSpanScale.Minutes; value /= TimeSpan.TicksPerMinute; } else if (value % TimeSpan.TicksPerSecond == 0) { scale = TimeSpanScale.Seconds; value /= TimeSpan.TicksPerSecond; } else if (value % TimeSpan.TicksPerMillisecond == 0) { scale = TimeSpanScale.Milliseconds; value /= TimeSpan.TicksPerMillisecond; } else { scale = TimeSpanScale.Ticks; } int len = 0; ulong zig = SerializationContext.Zig(value); if (lengthPrefixed) { if (scale != TimeSpanScale.Days) { len += 2; } if (zig != 0) { len += 1 + SerializationContext.GetLength(zig); } context.WriteByte((byte)len); len = 1; } if (value != 0) { context.WriteByte((FieldTimeSpanValue << 3) | (int)WireType.Variant); len += 1 + context.EncodeUInt64(zig); } if (scale != TimeSpanScale.Days) { context.WriteByte((FieldTimeSpanScale << 3) | (int)WireType.Variant); len += 1 + context.EncodeInt32((int)scale); } return(len); }