服务器如何检测不同的序列化类?C#
本文关键字:序列化 何检测 检测 服务器 | 更新日期: 2023-09-27 18:20:07
服务器如何知道正在发送哪个序列化类?
客户端:
public void SendCard(Card card)
{
var xmlSerializer = new XmlSerializer(typeof(Card));
xmlSerializer.Serialize(s, card);
}
public void SendStage(Stage stage)
{
var ser = new XmlSerializer(typeof(Stage));
ser.Serialize(s, stage);
}
服务器端:
private void Receive()
{
byte[] message = new byte[8192];
int bytesread;
s = a_client.GetStream();
while (true)
{
bytesread = 0;
try
{
//blocks until a message is read
bytesread = s.Read(message, 0, 8192);
}
catch (Exception z) { Console.WriteLine(z.Message); break; }
if (bytesread == 0)
{
// the client has disconnected
break;
}
//Message successfully received
ASCIIEncoding encoder = new ASCIIEncoding();
string smessage = encoder.GetString(message, 0, bytesread);
//Somewhere Here needs to detect if message is serialized Card, Stage, or string
}
}
就像它需要一个好的if语句之类的。而得到的错误是,这篇文章大多是代码。。希望这个问题是可以解释的。
尝试一种稍微不同的设计模式,其中序列化的类总是相同的,但它包含两个属性:一个是您真正想要的类,序列化为泛型对象,另一个是包含您真正想要类的类型的字符串。这样,服务器/客户端的通信总是一样的。
该技术唯一需要注意的是,服务器和客户端必须引用完全相同的类类型,因为XML序列化/反序列化对象必须提前知道要序列化/反串行化的类类型。从你提出问题的方式来看,我认为这还可以
首先,一些辅助类。请注意XMLInclude的使用——这是一个警告。
[Serializable]
public class card
{ }
[Serializable]
public class stage
{ }
[Serializable]
[XmlInclude(typeof(card)), XmlInclude(typeof(stage))]
public class serializeHelper
{
public object Package { get; set; }
public string PackageType { get; set; }
public serializeHelper() { } // required for deserialization
public serializeHelper(object aPackage)
{
Package = aPackage;
PackageType = aPackage.GetType().FullName;
}
}
以及展示其工作原理的测试代码。这里的关键技巧是Convert.ChangeType方法。
// serialize a helper class containing a card
// use a local file for the example
string path = System.IO.Path.GetTempFileName();
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(path);
serializeHelper toBeSerialized = new serializeHelper(new card());
XmlSerializer xmlSer = new XmlSerializer(typeof(serializeHelper));
xmlSer.Serialize(streamWriter, toBeSerialized);
streamWriter.Close();
// deserialize the helper class
System.IO.StreamReader streamReader = new System.IO.StreamReader(path);
XmlSerializer xmlDeser = new XmlSerializer(typeof(serializeHelper));
serializeHelper wasDeserialized = (serializeHelper)(xmlDeser.Deserialize(streamReader));
streamReader.Close();
// get the type, and convert the package to the desired type
Type t = Type.GetType(wasDeserialized.PackageType);
object theFinalObject = Convert.ChangeType(wasDeserialized.Package, t);
最后,如果您希望最终对象不是object或var类型,则必须找到适合您的方法。VB允许您在类型上使用Select Case,但C#不能在类型上执行切换。