MessageSerializeHelper.cs 3.2 KB

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