public static decimal DeserializeDecimal(SerializationContext context) { ulong low = 0; uint high = 0; uint signScale = 0; uint prefix; bool keepRunning = true; while (keepRunning && context.TryReadFieldPrefix(out prefix)) { switch (prefix) { case (FieldDecimalLow << 3) | (int)WireType.Variant: low = (ulong)context.DecodeInt64(); break; case (FieldDecimalHigh << 3) | (int)WireType.Variant: high = (uint)context.DecodeInt32(); break; case (FieldDecimalSignScale << 3) | (int)WireType.Variant: signScale = (uint)context.DecodeInt32(); break; default: WireType wireType; int fieldTag; Serializer.ParseFieldToken(prefix, out wireType, out fieldTag); if (wireType == WireType.EndGroup) { context.EndGroup(fieldTag); keepRunning = false; continue; } switch (fieldTag) { case FieldDecimalHigh: case FieldDecimalLow: case FieldDecimalSignScale: throw new ProtoException("Incorrect wire-type deserializing Decimal"); default: Serializer.SkipData(context, fieldTag, wireType); break; } break; } } if (low == 0 && high == 0) return decimal.Zero; int lo = (int)(low & 0xFFFFFFFFL), mid = (int)((low >> 32) & 0xFFFFFFFFL), hi = (int)high; bool isNeg = (signScale & 0x0001) == 0x0001; byte scale = (byte)((signScale & 0x01FE) >> 1); return new decimal(lo, mid, hi, isNeg, scale); }
private static long DeserializeTicks(SerializationContext context) { long value = 0; TimeSpanScale scale = TimeSpanScale.Days; uint prefix; bool keepRunning = true; while (keepRunning && context.TryReadFieldPrefix(out prefix)) { switch (prefix) { case (FieldTimeSpanScale << 3) | (int)WireType.Variant: scale = (TimeSpanScale)context.DecodeInt32(); break; case (FieldTimeSpanValue << 3) | (int)WireType.Variant: value = SerializationContext.Zag(context.DecodeUInt64()); break; default: WireType wireType; int fieldTag; Serializer.ParseFieldToken(prefix, out wireType, out fieldTag); if (wireType == WireType.EndGroup) { context.EndGroup(fieldTag); keepRunning = false; continue; } switch (fieldTag) { case FieldTimeSpanScale: case FieldTimeSpanValue: throw new ProtoException("Incorrect wire-type deserializing TimeSpan"); default: Serializer.SkipData(context, fieldTag, wireType); break; } break; } } switch (scale) { case TimeSpanScale.Days: return value * TimeSpan.TicksPerDay; case TimeSpanScale.Hours: return value * TimeSpan.TicksPerHour; case TimeSpanScale.Minutes: return value * TimeSpan.TicksPerMinute; case TimeSpanScale.Seconds: return value * TimeSpan.TicksPerSecond; case TimeSpanScale.Milliseconds: return value * TimeSpan.TicksPerMillisecond; case TimeSpanScale.Ticks: return value; case TimeSpanScale.MinMax: switch (value) { case 1: return long.MaxValue; case -1: return long.MinValue; default: throw new ProtoException("Unknown min/max value: " + value.ToString()); } default: throw new ProtoException("Unknown timescale: " + scale.ToString()); } }
public static decimal DeserializeDecimal(SerializationContext context) { ulong low = 0; uint high = 0; uint signScale = 0; uint prefix; bool keepRunning = true; while (keepRunning && context.TryReadFieldPrefix(out prefix)) { switch (prefix) { case (FieldDecimalLow << 3) | (int)WireType.Variant: low = (ulong)context.DecodeInt64(); break; case (FieldDecimalHigh << 3) | (int)WireType.Variant: high = (uint)context.DecodeInt32(); break; case (FieldDecimalSignScale << 3) | (int)WireType.Variant: signScale = (uint)context.DecodeInt32(); break; default: WireType wireType; int fieldTag; Serializer.ParseFieldToken(prefix, out wireType, out fieldTag); if (wireType == WireType.EndGroup) { context.EndGroup(fieldTag); keepRunning = false; continue; } switch (fieldTag) { case FieldDecimalHigh: case FieldDecimalLow: case FieldDecimalSignScale: throw new ProtoException("Incorrect wire-type deserializing Decimal"); default: Serializer.SkipData(context, fieldTag, wireType); break; } break; } } if (low == 0 && high == 0) { return(decimal.Zero); } int lo = (int)(low & 0xFFFFFFFFL), mid = (int)((low >> 32) & 0xFFFFFFFFL), hi = (int)high; bool isNeg = (signScale & 0x0001) == 0x0001; byte scale = (byte)((signScale & 0x01FE) >> 1); return(new decimal(lo, mid, hi, isNeg, scale)); }