DateTimeSerializer.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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 DateTimeSerializer : IProtoSerializer
  11. {
  12. #if FEAT_IKVM
  13. readonly Type expectedType;
  14. #else
  15. static readonly Type expectedType = typeof(DateTime);
  16. #endif
  17. public Type ExpectedType => expectedType;
  18. bool IProtoSerializer.RequiresOldValue => false;
  19. bool IProtoSerializer.ReturnsValue => true;
  20. private readonly bool includeKind, wellKnown;
  21. public DateTimeSerializer(DataFormat dataFormat, ProtoBuf.Meta.TypeModel model)
  22. {
  23. #if FEAT_IKVM
  24. expectedType = model.MapType(typeof(DateTime));
  25. #endif
  26. wellKnown = dataFormat == DataFormat.WellKnown;
  27. includeKind = model != null && model.SerializeDateTimeKind();
  28. }
  29. #if !FEAT_IKVM
  30. public object Read(object value, ProtoReader source)
  31. {
  32. if(wellKnown)
  33. {
  34. return BclHelpers.ReadTimestamp(source);
  35. }
  36. else
  37. {
  38. Helpers.DebugAssert(value == null); // since replaces
  39. return BclHelpers.ReadDateTime(source);
  40. }
  41. }
  42. public void Write(object value, ProtoWriter dest)
  43. {
  44. if(wellKnown)
  45. BclHelpers.WriteTimestamp((DateTime)value, dest);
  46. else if(includeKind)
  47. BclHelpers.WriteDateTimeWithKind((DateTime)value, dest);
  48. else
  49. BclHelpers.WriteDateTime((DateTime)value, dest);
  50. }
  51. #endif
  52. #if FEAT_COMPILER
  53. void IProtoSerializer.EmitWrite(Compiler.CompilerContext ctx, Compiler.Local valueFrom)
  54. {
  55. ctx.EmitWrite(ctx.MapType(typeof(BclHelpers)),
  56. wellKnown ? nameof(BclHelpers.WriteTimestamp)
  57. : includeKind ? nameof(BclHelpers.WriteDateTimeWithKind) : nameof(BclHelpers.WriteDateTime), 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.ReadTimestamp) : nameof(BclHelpers.ReadDateTime),
  64. ExpectedType);
  65. }
  66. #endif
  67. }
  68. }
  69. #endif