[improv]优化Packet.ToArray性能问题
大石头
编写于
2024-09-11 09:04:36
X
using NewLife.Data;
using NewLife.Reflection;
namespace NewLife.Messaging;
/// <summary>消息命令</summary>
public interface IMessage
{
/// <summary>是否响应</summary>
Boolean Reply { get; }
/// <summary>是否有错</summary>
Boolean Error { get; set; }
/// <summary>单向请求</summary>
Boolean OneWay { get; }
/// <summary>负载数据</summary>
Packet? Payload { get; set; }
/// <summary>根据请求创建配对的响应消息</summary>
/// <returns></returns>
IMessage? CreateReply();
/// <summary>从数据包中读取消息</summary>
/// <param name="pk"></param>
/// <returns>是否成功</returns>
Boolean Read(Packet pk);
/// <summary>把消息转为封包</summary>
/// <returns></returns>
Packet? ToPacket();
}
/// <summary>消息命令基类</summary>
public class Message : IMessage
{
/// <summary>是否响应</summary>
public Boolean Reply { get; set; }
/// <summary>是否有错</summary>
public Boolean Error { get; set; }
/// <summary>单向请求</summary>
public Boolean OneWay { get; set; }
/// <summary>负载数据</summary>
public Packet? Payload { get; set; }
/// <summary>根据请求创建配对的响应消息</summary>
/// <returns></returns>
public virtual IMessage CreateReply()
{
if (Reply) throw new Exception("Cannot create response message based on response message");
var msg = GetType().CreateInstance() as Message;
if (msg == null) throw new InvalidDataException($"Cannot create an instance of type [{GetType().FullName}]");
msg.Reply = true;
return msg;
}
/// <summary>从数据包中读取消息</summary>
/// <param name="pk"></param>
/// <returns>是否成功</returns>
public virtual Boolean Read(Packet pk)
{
Payload = pk;
return true;
}
/// <summary>把消息转为封包</summary>
/// <returns></returns>
public virtual Packet? ToPacket() => Payload;
}
|