TimeSpanSerializer.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #if !NO_RUNTIME
  2. using System;
  3. #if FEAT_IKVM
  4. using Type = IKVM.Reflection.Type;
  5. using IKVM.Reflection;
  6. #else
  7. #endif
  8. namespace ProtoBuf.Serializers
  9. {
  10. sealed class TimeSpanSerializer : IProtoSerializer
  11. {
  12. #if FEAT_IKVM
  13. readonly Type expectedType;
  14. #else
  15. static readonly Type expectedType = typeof(TimeSpan);
  16. #endif
  17. private readonly bool wellKnown;
  18. public TimeSpanSerializer(DataFormat dataFormat, ProtoBuf.Meta.TypeModel model)
  19. {
  20. #if FEAT_IKVM
  21. expectedType = model.MapType(typeof(TimeSpan));
  22. #endif
  23. wellKnown = dataFormat == DataFormat.WellKnown;
  24. }
  25. public Type ExpectedType => expectedType;
  26. bool IProtoSerializer.RequiresOldValue => false;
  27. bool IProtoSerializer.ReturnsValue => true;
  28. #if !FEAT_IKVM
  29. public object Read(object value, ProtoReader source)
  30. {
  31. if (wellKnown)
  32. {
  33. return BclHelpers.ReadDuration(source);
  34. }
  35. else
  36. {
  37. Helpers.DebugAssert(value == null); // since replaces
  38. return BclHelpers.ReadTimeSpan(source);
  39. }
  40. }
  41. public void Write(object value, ProtoWriter dest)
  42. {
  43. if (wellKnown)
  44. {
  45. BclHelpers.WriteDuration((TimeSpan)value, dest);
  46. }
  47. else
  48. {
  49. BclHelpers.WriteTimeSpan((TimeSpan)value, dest);
  50. }
  51. }
  52. #endif
  53. #if FEAT_COMPILER
  54. void IProtoSerializer.EmitWrite(Compiler.CompilerContext ctx, Compiler.Local valueFrom)
  55. {
  56. ctx.EmitWrite(ctx.MapType(typeof(BclHelpers)),
  57. wellKnown ? nameof(BclHelpers.WriteDuration) : nameof(BclHelpers.WriteTimeSpan), valueFrom);
  58. }
  59. void IProtoSerializer.EmitRead(Compiler.CompilerContext ctx, Compiler.Local valueFrom)
  60. {
  61. if (wellKnown) ctx.LoadValue(valueFrom);
  62. ctx.EmitBasicRead(ctx.MapType(typeof(BclHelpers)),
  63. wellKnown ? nameof(BclHelpers.ReadDuration) : nameof(BclHelpers.ReadTimeSpan),
  64. ExpectedType);
  65. }
  66. #endif
  67. }
  68. }
  69. #endif