如果我不执行';I don’我不知道正确的类型
本文关键字:我不知道 类型 don 执行 如果 | 更新日期: 2023-09-27 18:23:44
我想在客户端和服务器之间发送命令和数据。
我有三个项目:
- 客户
- 服务器
- Common-这里我放了Common类和网络抽象层
我使用以下数据结构进行客户端和服务器之间的通信
public class Packet<T>
{
public string Name { get; set; }
public string From { get; set; }
public string To { get; set; }
public PacketType PacketType { get; set; }
public T Container { get; set; }
public Packet()
{
}
public Packet(string name, PacketType packetType, T container)
{
Name = name;
PacketType = packetType;
Container = container;
}
}
public enum PacketType
{
Command,
Data
}
如果我需要发送有关文件的信息,我只需创建一个具有必要结构CreatePacket<FilesInfo>(filesInfo)
的数据包,然后将其序列化并发送到客户端''服务器。
但是如何在接收端反序列化数据呢?我不知道数据包的对象类型是什么。有其他方法或库或其他东西可以解决我的问题吗?此外,我不想使用WCF,因为我的应用程序应该在安装了.NET 2.0的计算机上运行。
chrfin和haiyyu都有相同的好主意。下面是在构造时使用PacketBase类来保存类型数据的小改动。您将数据包<T>并反序列化为数据包。使用起来很简单。尽管如此,正如已经提到的技巧是使Type易于访问。
class Program
{
static void Main(string[] args)
{
var pack = new Packet<int>() { Payload = 13 };
var serializedData = pack.Serialize();
var deserializedData = Packet.Deserialize(serializedData);
Console.WriteLine("The payload type is:" + deserializedData.PayloadType.Name);
Console.WriteLine("the payload is: " + deserializedData.Payload);
Console.ReadLine();
}
}
[Serializable]
public class Packet
{
public Type PayloadType { get; protected set; }
public object Payload { get; protected set; }
public static Packet Deserialize(byte[] bytes)
{
return (Packet)(new BinaryFormatter()).Deserialize(new MemoryStream(bytes));
}
}
[Serializable]
class Packet<T> : Packet
{
public Packet()
{
PayloadType = typeof(T);
}
public new T Payload
{
get { return (T)base.Payload; }
set { base.Payload = value; }
}
public override string ToString()
{
return "[Packet]" + Payload.ToString();
}
public byte[] Serialize()
{
MemoryStream m = new MemoryStream();
(new BinaryFormatter()).Serialize(m, this);
return m.ToArray();
}
}
服务器和客户端应用程序都必须使用相同的类型。然后,发送方可以将数据类型作为字符串告诉接收方,接收方将能够使用type.GetType().
您可以将包装封装在一个容器中,该容器还包含以下类型:
public class Container
{
public Type PacketType { get; set; }
public byte[] Packet { get; set; }
}
然后
Container c = (Container)cSerializer.Deserialize(/*Your Received Packet*/);
Packet<c.PacketType> paket =
(Packet<c.PacketType>)pSerializer.Deserialize(new MemoryStream(c.Packet));
或者你可以要求T
总是扩展基类,然后在接收端使用它:
Packet<BaseClass> paket =
(Packet<BaseClass>)pSerializer.Deserialize(new MemoryStream(/*Data*/));
如果您正在使用XML序列化,这似乎可以很好地工作。。。。
private string GetClassNameFromXMLSerializedString(string xml)
{
xml = xml.Substring(xml.IndexOf(">'r'n<") + 3, 50);//get second XML element
return xml.Substring(1, xml.IndexOf(' ') - 1);//get class name
}