public override CreateSelectObjectMetaResult Deserialize()

in sdk/Transform/SelectObjectMetaRequestDeserializer.cs [22:141]


        public override CreateSelectObjectMetaResult Deserialize(ServiceResponse xmlStream)
        {
            var result = new CreateSelectObjectMetaResult();
            var buff = new byte[128];
            uint payloadCrc32 = 0;
            int readCnt = 0;
            bool gotEndFrame = false;
            _gotEndofStream = false;
            CRC32.Init();

            while (!gotEndFrame)
            {
                //Version | Frame - Type | Payload Length | Header Checksum | Payload | Payload Checksum
                //<1 bytes> <--3 bytes-->   <-- 4 bytes --> <------4 bytes--> <variable><----4bytes------>
                //Payload 
                //<offset | data>
                //<8 bytes><variable>

                //read Header 12 bytes
                readCnt = TryRead(xmlStream.Content, buff, 0, 12);

                if (_gotEndofStream)
                    break;

                ensureReadSize(12, readCnt);

                //version

                //Frame - Type
                int frameType = OssUtils.ConvertBytesToInt(buff, 1, 3);

                //Payload Length
                int payloadLength = OssUtils.ConvertBytesToInt(buff, 4, 4);

                //Header Checksum
                int headerCheckSum = OssUtils.ConvertBytesToInt(buff, 8, 4);

                //read Playload
                switch (frameType)
                {
                    case 0x800006:      //Meta End Frame(Csv)
                    case 0x800007:      //Meta End Frame(Json)
                        payloadLength -= 32;
                        // 32 bytes
                        readCnt = TryRead(xmlStream.Content, buff, 0, 32);
                        ensureReadSize(32, readCnt);
                        payloadCrc32 = CRC32.GetCRC32Byte(buff, 32, payloadCrc32);

                        // offset 8 bytes
                        result.Offset = OssUtils.ConvertBytesToLong(buff, 0, 8);

                        // total scaned 8bytes
                        result.TotalScannedBytes = OssUtils.ConvertBytesToLong(buff, 8, 8);

                        // status 4 bytes
                        result.Status = OssUtils.ConvertBytesToInt(buff, 16, 4);

                        // splitsCount 4 bytes
                        result.SplitsCount = OssUtils.ConvertBytesToLong(buff, 20, 4);

                        // rowsCount 8 bytes
                        result.RowsCount = OssUtils.ConvertBytesToLong(buff, 24, 8);
                        // 32 bytes

                        if (frameType == 0x800006)
                        {
                            payloadLength -= 4;
                            // colsCount 4 bytes
                            readCnt = TryRead(xmlStream.Content, buff, 0, 4);
                            ensureReadSize(4, readCnt);
                            result.ColumnsCount = OssUtils.ConvertBytesToLong(buff, 0, 4);
                            payloadCrc32 = CRC32.GetCRC32Byte(buff, 4, payloadCrc32);
                        }

                        while (payloadLength > 0)
                        {
                            int len = Math.Min(buff.Length, payloadLength);
                            readCnt = TryRead(xmlStream.Content, buff, 0, len);
                            ensureReadSize(len, readCnt);
                            if (string.IsNullOrEmpty(result.ErrorMessage))
                            { 
                                result.ErrorMessage = System.Text.Encoding.Default.GetString(buff, 0, readCnt);
                            }
                            payloadCrc32 = CRC32.GetCRC32Byte(buff, readCnt, payloadCrc32);
                            payloadLength -= readCnt;
                        }

                        //Payload Checksum                
                        readCnt = TryRead(xmlStream.Content, buff, 0, 4);
                        ensureReadSize(4, readCnt);
                        uint serverCrc32 = OssUtils.ConvertBytesToUint(buff, 0, 4);

                        //Payload Crc32 check  
                        if (serverCrc32 != 0 && serverCrc32 != payloadCrc32)
                        {
                            throw new ClientException(string.Format("Payload checksum check fail server CRC {0}, client CRC {1}",
                                serverCrc32, payloadCrc32));
                        }
                        gotEndFrame = true;
                        break;
                    default:
                        //skip playload
                        readCnt = TrySkip(xmlStream.Content, payloadLength);
                        ensureReadSize(payloadLength, readCnt);

                        //skip payload Checksum
                        readCnt = TryRead(xmlStream.Content, buff, 0, 4);
                        ensureReadSize(4, readCnt);
                        break;
                }
            }

            if (!gotEndFrame)
            {
                throw new ClientException("No end frame exists.");
            }

            DeserializeGeneric(xmlStream, result);
            return result;
        }