DecimalSerializer.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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 DecimalSerializer : IProtoSerializer
  11. {
  12. #if FEAT_IKVM
  13. readonly Type expectedType;
  14. #else
  15. static readonly Type expectedType = typeof(decimal);
  16. #endif
  17. public DecimalSerializer(ProtoBuf.Meta.TypeModel model)
  18. {
  19. #if FEAT_IKVM
  20. expectedType = model.MapType(typeof(decimal));
  21. #endif
  22. }
  23. public Type ExpectedType { get { return expectedType; } }
  24. bool IProtoSerializer.RequiresOldValue { get { return false; } }
  25. bool IProtoSerializer.ReturnsValue { get { return true; } }
  26. #if !FEAT_IKVM
  27. public object Read(object value, ProtoReader source)
  28. {
  29. Helpers.DebugAssert(value == null); // since replaces
  30. return BclHelpers.ReadDecimal(source);
  31. }
  32. public void Write(object value, ProtoWriter dest)
  33. {
  34. BclHelpers.WriteDecimal((decimal)value, dest);
  35. }
  36. #endif
  37. #if FEAT_COMPILER
  38. void IProtoSerializer.EmitWrite(Compiler.CompilerContext ctx, Compiler.Local valueFrom)
  39. {
  40. ctx.EmitWrite(ctx.MapType(typeof(BclHelpers)), "WriteDecimal", valueFrom);
  41. }
  42. void IProtoSerializer.EmitRead(Compiler.CompilerContext ctx, Compiler.Local valueFrom)
  43. {
  44. ctx.EmitBasicRead(ctx.MapType(typeof(BclHelpers)), "ReadDecimal", ExpectedType);
  45. }
  46. #endif
  47. }
  48. }
  49. #endif