BlobSerializer.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #if !NO_RUNTIME
  2. using System;
  3. #if FEAT_COMPILER
  4. using System.Reflection.Emit;
  5. #endif
  6. #if FEAT_IKVM
  7. using Type = IKVM.Reflection.Type;
  8. #endif
  9. namespace ProtoBuf.Serializers
  10. {
  11. sealed class BlobSerializer : IProtoSerializer
  12. {
  13. public Type ExpectedType { get { return expectedType; } }
  14. #if FEAT_IKVM
  15. readonly Type expectedType;
  16. #else
  17. static readonly Type expectedType = typeof(byte[]);
  18. #endif
  19. public BlobSerializer(ProtoBuf.Meta.TypeModel model, bool overwriteList)
  20. {
  21. #if FEAT_IKVM
  22. expectedType = model.MapType(typeof(byte[]));
  23. #endif
  24. this.overwriteList = overwriteList;
  25. }
  26. private readonly bool overwriteList;
  27. #if !FEAT_IKVM
  28. public object Read(object value, ProtoReader source)
  29. {
  30. return ProtoReader.AppendBytes(overwriteList ? null : (byte[])value, source);
  31. }
  32. public void Write(object value, ProtoWriter dest)
  33. {
  34. ProtoWriter.WriteBytes((byte[])value, dest);
  35. }
  36. #endif
  37. bool IProtoSerializer.RequiresOldValue { get { return !overwriteList; } }
  38. bool IProtoSerializer.ReturnsValue { get { return true; } }
  39. #if FEAT_COMPILER
  40. void IProtoSerializer.EmitWrite(Compiler.CompilerContext ctx, Compiler.Local valueFrom)
  41. {
  42. ctx.EmitBasicWrite("WriteBytes", valueFrom);
  43. }
  44. void IProtoSerializer.EmitRead(Compiler.CompilerContext ctx, Compiler.Local valueFrom)
  45. {
  46. if (overwriteList)
  47. {
  48. ctx.LoadNullRef();
  49. }
  50. else
  51. {
  52. ctx.LoadValue(valueFrom);
  53. }
  54. ctx.LoadReaderWriter();
  55. ctx.EmitCall(ctx.MapType(typeof(ProtoReader)).GetMethod("AppendBytes"));
  56. }
  57. #endif
  58. }
  59. }
  60. #endif