簡體   English   中英

C#Protobuf-net:如何從網絡流中連續反序列化?

[英]C# Protobuf-net: how do I deserialize consecutively from a network stream?

我(非常感謝)使用Marc Gravell的出色的Protobuf-net協議緩沖區庫。 不幸的是,我不夠智能,無法理解反序列化通過電線插入的對象的正確方法。

作為我努力的基礎,我遵循以下問題的建議:

使用protobuf-net對序列化的數據進行反序列化(protocolBuffer)
protobuf:到/從套接字連續序列化和反序列化

我在整個會話期間(幾分鍾,幾小時...誰知道?)保持TCP連接打開,並使用一個只要連接一直持續的單個網絡流。 我正在通過此流接收許多PB消息。

鑒於我使用的是“ TryDeserializeWithLengthPrefix”,因此我期望該庫能夠對流進行排序,以便有足夠的數據來解析整個對象。 但這似乎並非如此。

我寫了一個簡單的測試:

    [Test]
    public void DeserializeSimpleObjectInParts ()
    {
        SimpleObject origin = new SimpleObject();
        byte[] wholeObj = ProtobufSerializer.SerializeToByteArray ( origin );
        int length = wholeObj.Length;
        int midpoint = length / 2;
        int sizeA = midpoint;
        int sizeB = length - midpoint;
        byte[] aaa = new byte[sizeA];
        byte[] bbb = new byte[sizeB];
        for ( int i = 0; i < midpoint; i++ )
        {
            aaa [ i ] = wholeObj [ i ];
        }
        for ( int j = midpoint; j < length; j++ )
        {
            bbb [ j - midpoint ] = wholeObj [ j ];
        }

        using ( MemoryStream streamA = new MemoryStream ( aaa ) )
        {
            using ( MemoryStream streamB = new MemoryStream ( bbb ) )
            {
                streamA.Position = 0;
                streamB.Position = 0;
                Debug.LogDebug ( "streamA.Length = " + streamA.Length + ", streamB.Length = " + streamB.Length );

                object resultA = null;
                bool succeededA = false;
                try {
                    succeededA = ProtobufSerializer.Deserialize ( streamA, out resultA );
                }
                catch ( Exception e )
                {
                    Debug.LogDebug ( "Exception = " + e );
                    Debug.LogDebug ( "streamA.Position = " + streamA.Position + ", streamA.Length = " + streamA.Length );
                }
            }
        }
    }

請注意,在上面,“ ProtobufSerializer.Deserialize”僅僅是通過我自己的服務類直接調用“ TryDeserializeWithLengthPrefix”的調用。 類型編碼業務在那里。

當我運行此測試時,將引發以下異常:

System.IO.EndOfStreamException: Failed to read past end of stream.

來自Google朋友的建議表明,我有責任查看套接字代碼中的長度前綴。 但這有什么幫助? C#網絡流沒有供我比較的Length屬性。

我真的需要做一個中間步驟,在流上運行一個循環,構建正確大小的字節數組,然后從它們中產生新的流,然后將它們傳遞到Protobuf-net嗎? 這似乎是一種反模式,而且會打擊性能。

我在這里想念什么?

鑒於我使用的是“ TryDeserializeWithLengthPrefix”,因此我期望該庫能夠對流進行排序,以便有足夠的數據來解析整個對象。

沒有可靠,有效的方法來對抽象Stream對象進行“分類等待”。

C#網絡流沒有供我比較的Length屬性。

計算從套接字流寫入緩沖區流的數據。 這將是您的“ Length”屬性,用於與開始時獲得的長度前綴進行比較。 一旦有了足夠的數據,就將緩沖流找回前綴,然后將其傳遞給解串器以獲取對象。 現在,再次查找緩沖流,並重新使用它以獲取下一條消息。 重復。

暫無
暫無

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

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