簡體   English   中英

C# 將對象轉換為字節數組

[英]C# Converting object to byte array

我正在用 tcp 制作一個聊天系統的東西,它需要以字節數組的形式發送內容,但是當我將圖像轉換為字節數組時,發送它然后再轉換回來它會出現這個錯誤:'在解析完成之前遇到流結束.'。 使用字符串它工作得很好。

    public byte[] ObjectToByteArray(object obj)
    {
        BinaryFormatter formatter = new BinaryFormatter();
        using (var stream = new MemoryStream())
        {
            formatter.Serialize(stream, obj);
            return stream.ToArray();
        }
    }

    public object ByteArrayToObject(byte[] bytes)
    {
        using (var stream = new MemoryStream())
        {
            var binForm = new BinaryFormatter();
            stream.Write(bytes, 0, bytes.Length);
            stream.Position = 0;
            var obj = binForm.Deserialize(stream);
            return obj;
        }
    }

這里有兩件不同的事情; 首先,我不能充分強調這一點 不要使用BinaryFormatter 曾經。 傷害你。 存在許多序列化程序,而BinaryFormatter (以及表親NetDataContractSerializer )實際上是您應該使用的最后一個 如果您願意,我可以對此進行擴展,或者如果您願意,我可以建議替代方案。

現在; 至於實際問題:我強烈懷疑這不是您認為的那樣。 基於幾十年的網絡代碼工作經驗,我有一種預感,這里的真正問題是“框架”。 我的意思是:TCP 是流協議,而不是消息/數據包協議。 我強烈懷疑您沒有正確地對發送的確切字節進行解幀。 如果沒有看到您的套接字代碼,我不能肯定地說,但是......正如我所說:這是基於大量經驗的預感。 要對此進行調查:請注意您發送的字節長度,並注意您收到的字節長度。 我很確定你會發現它們是不同的。 如果仍有疑問:獲取發送的有效載荷和接收的有效載荷的 base-64 或十六進制字符串(例如Convert.ToBase64String ),並比較該字符串。 我很確定他們會變得不同。

歸根結底,網絡代碼很難 我可以嘗試解釋個別觀點,但“如何正確地通過網絡發送消息”可能會填滿一本書。 IMO,如果您對未來 5 年專門編寫網絡代碼不感興趣:請使用可以為您完成工作的現有工具,例如 gRPC。 存在許多其他消息傳遞 RPC 工具。

暫無
暫無

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

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