服务器如何检测不同的序列化类?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语句之类的。而得到的错误是,这篇文章大多是代码。。希望这个问题是可以解释的。

服务器如何检测不同的序列化类?C#

尝试一种稍微不同的设计模式,其中序列化的类总是相同的,但它包含两个属性:一个是您真正想要的类,序列化为泛型对象,另一个是包含您真正想要类的类型的字符串。这样,服务器/客户端的通信总是一样的。

该技术唯一需要注意的是,服务器和客户端必须引用完全相同的类类型,因为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#不能在类型上执行切换。