MessageSerializeHelper.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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)
  64. {
  65. int headOffset = Packet.ActorIdLength;
  66. MemoryStream stream = GetStream(headOffset + Packet.OpcodeLength);
  67. ushort opcode = OpcodeTypeComponent.Instance.GetOpcode(message.GetType());
  68. stream.Seek(headOffset + Packet.OpcodeLength, SeekOrigin.Begin);
  69. stream.SetLength(headOffset + Packet.OpcodeLength);
  70. stream.GetBuffer().WriteTo(headOffset, opcode);
  71. MessageSerializeHelper.SerializeTo(opcode, message, stream);
  72. stream.Seek(0, SeekOrigin.Begin);
  73. return (opcode, stream);
  74. }
  75. }
  76. }