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