MessageSerializeHelper.cs 3.3 KB

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