MessageSerializeHelper.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. try
  26. {
  27. if (opcode < OpcodeRangeDefine.PbMaxOpcode)
  28. {
  29. ProtobufHelper.ToStream(obj, memoryStream);
  30. return;
  31. }
  32. if (opcode >= OpcodeRangeDefine.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. catch (Exception e)
  46. {
  47. throw new Exception($"SerializeTo error: {opcode}", e);
  48. }
  49. }
  50. public static MemoryStream GetStream(int count = 0)
  51. {
  52. MemoryStream stream;
  53. if (count > 0)
  54. {
  55. stream = new MemoryStream(count);
  56. }
  57. else
  58. {
  59. stream = new MemoryStream();
  60. }
  61. return stream;
  62. }
  63. public static (ushort, MemoryStream) MessageToStream(object message, int count = 0)
  64. {
  65. MemoryStream stream = GetStream(Packet.OpcodeLength + count);
  66. ushort opcode = OpcodeTypeComponent.Instance.GetOpcode(message.GetType());
  67. stream.Seek(Packet.OpcodeLength, SeekOrigin.Begin);
  68. stream.SetLength(Packet.OpcodeLength);
  69. stream.GetBuffer().WriteTo(0, opcode);
  70. MessageSerializeHelper.SerializeTo(opcode, message, stream);
  71. stream.Seek(0, SeekOrigin.Begin);
  72. return (opcode, stream);
  73. }
  74. public static (ushort, MemoryStream) MessageToStream(long actorId, object message, int count = 0)
  75. {
  76. int actorSize = sizeof (long);
  77. MemoryStream stream = GetStream(actorSize + Packet.OpcodeLength + count);
  78. ushort opcode = OpcodeTypeComponent.Instance.GetOpcode(message.GetType());
  79. stream.Seek(actorSize + Packet.OpcodeLength, SeekOrigin.Begin);
  80. stream.SetLength(actorSize + Packet.OpcodeLength);
  81. // 写入actorId
  82. stream.GetBuffer().WriteTo(0, actorId);
  83. stream.GetBuffer().WriteTo(actorSize, opcode);
  84. MessageSerializeHelper.SerializeTo(opcode, message, stream);
  85. stream.Seek(0, SeekOrigin.Begin);
  86. return (opcode, stream);
  87. }
  88. }
  89. }