MessageSerializeHelper.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. return MongoHelper.FromStream(type, memoryStream);
  18. }
  19. public static void SerializeTo(ushort opcode, object obj, MemoryStream memoryStream)
  20. {
  21. try
  22. {
  23. if (opcode < OpcodeRangeDefine.PbMaxOpcode)
  24. {
  25. ProtobufHelper.ToStream(obj, memoryStream);
  26. return;
  27. }
  28. if (opcode >= OpcodeRangeDefine.JsonMinOpcode)
  29. {
  30. string s = JsonHelper.ToJson(obj);
  31. byte[] bytes = s.ToUtf8();
  32. memoryStream.Write(bytes, 0, bytes.Length);
  33. return;
  34. }
  35. MongoHelper.ToStream(obj, memoryStream);
  36. }
  37. catch (Exception e)
  38. {
  39. throw new Exception($"SerializeTo error: {opcode}", e);
  40. }
  41. }
  42. public static MemoryStream GetStream(int count = 0)
  43. {
  44. MemoryStream stream;
  45. if (count > 0)
  46. {
  47. stream = new MemoryStream(count);
  48. }
  49. else
  50. {
  51. stream = new MemoryStream();
  52. }
  53. return stream;
  54. }
  55. public static (ushort, MemoryStream) MessageToStream(object message)
  56. {
  57. int headOffset = Packet.ActorIdLength;
  58. MemoryStream stream = GetStream(headOffset + Packet.OpcodeLength);
  59. ushort opcode = OpcodeTypeComponent.Instance.GetOpcode(message.GetType());
  60. stream.Seek(headOffset + Packet.OpcodeLength, SeekOrigin.Begin);
  61. stream.SetLength(headOffset + Packet.OpcodeLength);
  62. stream.GetBuffer().WriteTo(headOffset, opcode);
  63. MessageSerializeHelper.SerializeTo(opcode, message, stream);
  64. stream.Seek(0, SeekOrigin.Begin);
  65. return (opcode, stream);
  66. }
  67. }
  68. }