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