簡體   English   中英

反序列化失敗-C#

[英]Deserialization Failure - C#

我寫了一些代碼,是對Messenger程序的一個簡單的模仿。 在程序中; 當用戶注銷時,我的LogOutCommand類的實例由客戶端程序准備,序列化並發送到服務器。 服務器收到LogOutCommand時,將反序列化並調用該類的Execute方法,該方法執行db操作等。

問題在於,有時Server可以很好地反序列化,但是有時會失敗。 據我了解,服務器有時會開始反序列化,然后完全准確地發送關聯的字節。

如何使服務器以等待所有相關字節發送完畢的方式啟動反序列化?

還是您認為還有另一個問題?

這是代碼:

//服務器監聽套接字

    private void ReadData(object obj)
    {
        Socket client = (Socket)obj;

        while (true)
        {
            if (client.Available > 0)
            {
                byte[] buffer = new byte[client.Available];
                client.Receive(buffer);
                ServerCommandBase cmd = CommandReader.ReadSrvCommand(buffer);
                cmd.Execute(context);

            }
        }
    }

// CommandReader類

public class CommandReader
{
    public static ServerCommandBase ReadSrvCommand(byte[] buffer)
    {
        return (ServerCommandBase)SerializationUtility.SerializationHelper.Deserialize(buffer);
    }
    public static ClientCommandBase ReadCliCommand(byte[] buffer)
    {
        return (ClientCommandBase)SerializationUtility.SerializationHelper.Deserialize(buffer);
    }

}

//序列化/反序列化類

公共類SerializationHelper {公共靜態字節[] Serialize(object obj){BinaryFormatter formatter = new BinaryFormatter(); MemoryStream流=新的MemoryStream(); 嘗試{formatter.Serialize(stream,obj); } catch(Exception){MessageBox.Show(“ Serialize Edilemiyor”); }
stream.Position = 0; 返回stream.ToArray(); }

    public static object Deserialize(byte[] byteArr)
    {
        BinaryFormatter formatter = new BinaryFormatter();
        MemoryStream ms = new MemoryStream(byteArr);
        ms.Position = 0;
        object retObj = null;
        try
        {
            retObj = formatter.Deserialize(ms);
        }
        catch (Exception)
        {
            MessageBox.Show("Cannot Be Deserialized!");
        }

        return retObj;
    }




}

我所看到的問題是,您試圖在管道中盡快對數據進行反序列化。 由於數據包是如何通過網絡發送的,因此這可能或不可能。

您應該發送帶有消息的標頭,以指示數據的長度(以字節為單位)。 然后,您將字節取入,直到該數字被擊中,然后才進行反序列化。

您的標頭應采用特定格式,並具有特定長度,以便在開始時輕松將其取下。

首先,您不應該使用BinaryFormatter。 最好使用XmlSerializer。

其次,請包括您獲得的異常詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM