C# 序列化和反序列化数据包

C# 序列化和反序列化数据包,c#,sockets,serialization,interface,C#,Sockets,Serialization,Interface,我试图更深入地了解套接字应用程序,并尝试创建一个带有数据包的服务器/客户端应用程序,作为序列化类 例如: [Serializable] class Msg { public String Cmd { get; set; } public Msg(String M) { this.Cmd = M; } } 我正在尝试使用接口使其易于阅读和更干净 public interface Packet { void Execute(); }

我试图更深入地了解套接字应用程序,并尝试创建一个带有数据包的服务器/客户端应用程序,作为序列化类
例如:

[Serializable]
class Msg 
{
    public String Cmd { get; set; }

    public Msg(String M)
    {
        this.Cmd = M;
    }

}
我正在尝试使用
接口使其易于阅读和更干净

public interface Packet
{
    void Execute();
}
数据包:

[Serializable]
class Msg : Packet
{
    public String Cmd { get; set; }

    public Msg(String M)
    {
        this.Cmd = M;
    }
    public void Execute()
    {
      Sender.Send(this);
    }
}
我的问题是,在反序列化数据包时,是否可以反序列化以了解数据包的类型,例如:

   Packet p = (Packet)Data; // data is the packet sent by the Client Desiralized
   var type = p.GetType();
然后像这样使用它:

if (type== Typeof(Packet.Msg))
   {
       // handle data
   }
是否可以通过数据包接口获取数据包类型?
编辑: 因为我注意到在System.Type引用的.NET中有一个GetType方法返回类的类型,所以我是一个试图知道它是否可以返回类的类型(数据包)

比如:

    public void Send<T>(T packet) where T : IPacket
    {
        if (!Connected || packet == null) return;

        lock (_sendBuffers)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                try
                {
                    _parentServer.Serializer.Serialize(ms, packet);
                }
                catch (Exception)
                {
                    Disconnect();
                    return;
                }

                byte[] payload = ms.ToArray();

                _sendBuffers.Enqueue(payload);

                OnClientWrite(packet, payload.LongLength, payload);

                lock (_sendingPacketsLock)
                {
                    if (_sendingPackets) return;

                    _sendingPackets = true;
                }
                ThreadPool.QueueUserWorkItem(Send);
            }
        }
    }
公共无效发送(T数据包),其中T:IPacket
{
如果(!Connected | | packet==null)返回;
锁定(发送缓冲区)
{
使用(MemoryStream ms=new MemoryStream())
{
尝试
{
_parentServer.Serializer.Serialize(ms,数据包);
}
捕获(例外)
{
断开连接();
返回;
}
字节[]有效载荷=ms.ToArray();
_sendBuffers.Enqueue(有效负载);
OnClientWrite(数据包,有效负载.LongLength,有效负载);
锁(发送包锁)
{
如果(_发送数据包)返回;
_sendingPackets=true;
}
ThreadPool.QueueUserWorkItem(发送);
}
}
}

如何使用基于文本的协议,如xml或json,以便通过简单的检查轻松定义其中的类型。可能是这样的:我的问题是关于使用接口的,我不需要解决方案,我需要了解如何使用它好的,我在等待你的新问题,在你解决了接口的问题之后,这些问题在序列化/反序列化对象时总是会出现:)我想我的问题不是太好,我会编辑它,请创建一个,否则它太宽,无法在这里回答。另请参阅如何使用基于文本的协议(如xml或json),以便通过简单的检查轻松定义其中的类型。可能是这样的:我的问题是关于使用接口的,我不需要解决方案,我需要了解如何使用它好的,我在等待你的新问题,在你解决了接口的问题之后,这些问题在序列化/反序列化对象时总是会出现:)我想我的问题不是太好,我会编辑它,请创建一个,否则它太宽,无法在这里回答。另见