RPCMessage.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System;
  2. using System.IO;
  3. using InABox.Core;
  4. using MessagePack;
  5. namespace InABox.Rpc
  6. {
  7. [Serializable]
  8. public partial class RpcMessage : ISerializeBinary, ICoreFormattable
  9. {
  10. public Guid Id { get; set; }
  11. public String Command { get; set; }
  12. public byte[] Payload { get; set; }
  13. public RpcError Error { get; set; }
  14. public override string ToString() => $"{Command} [{Error}]";
  15. public RpcMessage()
  16. {
  17. Id = Guid.NewGuid();
  18. Command = "";
  19. Payload = Array.Empty<byte>();
  20. Error = RpcError.NONE;
  21. }
  22. public RpcMessage(Guid id, string command, byte[] payload) : this()
  23. {
  24. Id = id;
  25. Command = command;
  26. Payload = payload;
  27. Error = RpcError.NONE;
  28. }
  29. public void SerializeBinary(CoreBinaryWriter writer)
  30. {
  31. writer.Write(Id);
  32. writer.Write(Command);
  33. writer.WriteBinaryValue(Payload);
  34. writer.Write(Error.ToString());
  35. }
  36. public void DeserializeBinary(CoreBinaryReader reader)
  37. {
  38. Id = reader.ReadGuid();
  39. Command = reader.ReadString();
  40. Payload = reader.ReadBinaryValue<byte[]>();
  41. if (Enum.TryParse<RpcError>(reader.ReadString(), out var error))
  42. Error = error;
  43. }
  44. public void Write(BinaryWriter writer)
  45. {
  46. writer.Write(Id);
  47. writer.Write(Command);
  48. writer.Write(Payload.Length);
  49. writer.Write(Payload);
  50. writer.Write((Int32)Error);
  51. }
  52. public void Read(BinaryReader reader)
  53. {
  54. Id = reader.ReadGuid();
  55. Command = reader.ReadString();
  56. var _length = reader.ReadInt32();
  57. Payload = reader.ReadBytes(_length);
  58. Error = (RpcError)reader.ReadInt32();
  59. }
  60. }
  61. }