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