MessageSerializeHelper.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using System;
  2. using System.IO;
  3. using MongoDB.Bson.IO;
  4. namespace ET
  5. {
  6. public static class MessageSerializeHelper
  7. {
  8. public const ushort PbMaxOpcode = 40000;
  9. public const ushort JsonMinOpcode = 51000;
  10. public static object DeserializeFrom(ushort opcode, Type type, MemoryStream memoryStream)
  11. {
  12. if (opcode < PbMaxOpcode)
  13. {
  14. return ProtobufHelper.FromStream(type, memoryStream);
  15. }
  16. if (opcode >= JsonMinOpcode)
  17. {
  18. return JsonHelper.FromJson(type, memoryStream.GetBuffer().ToStr((int)memoryStream.Position, (int)(memoryStream.Length - memoryStream.Position)));
  19. }
  20. #if NOT_CLIENT
  21. return MongoHelper.FromStream(type, memoryStream);
  22. #else
  23. throw new Exception($"client no message: {opcode}");
  24. #endif
  25. }
  26. public static void SerializeTo(ushort opcode, object obj, MemoryStream memoryStream)
  27. {
  28. if (opcode < PbMaxOpcode)
  29. {
  30. ProtobufHelper.ToStream(obj, memoryStream);
  31. return;
  32. }
  33. if (opcode >= JsonMinOpcode)
  34. {
  35. string s = JsonHelper.ToJson(obj);
  36. byte[] bytes = s.ToUtf8();
  37. memoryStream.Write(bytes, 0, bytes.Length);
  38. return;
  39. }
  40. #if NOT_CLIENT
  41. MongoHelper.ToStream(obj, memoryStream);
  42. #else
  43. throw new Exception($"client no message: {opcode}");
  44. #endif
  45. }
  46. public static MemoryStream GetStream(int count = 0)
  47. {
  48. MemoryStream stream;
  49. if (count > 0)
  50. {
  51. stream = new MemoryStream(count);
  52. }
  53. else
  54. {
  55. stream = new MemoryStream();
  56. }
  57. return stream;
  58. }
  59. public static (ushort, MemoryStream) MessageToStream(object message, int count = 0)
  60. {
  61. MemoryStream stream = GetStream(Packet.OpcodeLength + count);
  62. ushort opcode = OpcodeTypeComponent.Instance.GetOpcode(message.GetType());
  63. stream.Seek(Packet.OpcodeLength, SeekOrigin.Begin);
  64. stream.SetLength(Packet.OpcodeLength);
  65. stream.GetBuffer().WriteTo(0, opcode);
  66. MessageSerializeHelper.SerializeTo(opcode, message, stream);
  67. stream.Seek(0, SeekOrigin.Begin);
  68. return (opcode, stream);
  69. }
  70. public static (ushort, MemoryStream) MessageToStream(long actorId, object message, int count = 0)
  71. {
  72. int actorSize = sizeof (long);
  73. MemoryStream stream = GetStream(actorSize + Packet.OpcodeLength + count);
  74. ushort opcode = OpcodeTypeComponent.Instance.GetOpcode(message.GetType());
  75. stream.Seek(actorSize + Packet.OpcodeLength, SeekOrigin.Begin);
  76. stream.SetLength(actorSize + Packet.OpcodeLength);
  77. // 写入actorId
  78. stream.GetBuffer().WriteTo(0, actorId);
  79. stream.GetBuffer().WriteTo(actorSize, opcode);
  80. MessageSerializeHelper.SerializeTo(opcode, message, stream);
  81. stream.Seek(0, SeekOrigin.Begin);
  82. return (opcode, stream);
  83. }
  84. }
  85. }