private uint PopDataRecord(CUQueue UQueue, ref object[] aData)
 {
     int n;
     byte bData = 0;
     byte bOne = 1;
     if (m_dts == null)
         throw new InvalidOperationException("DataTable header is not de-serialized yet");
     uint nSize = UQueue.GetSize();
     int nLen = m_dts.Length;
     if (aData == null || aData.Length != nLen)
         aData = new object[nLen];
     uint nBits = (uint)(m_dts.Length / 8 + (((m_dts.Length % 8) != 0) ? 1 : 0));
     byte[] aBit = new byte[nBits];
     UQueue.Pop(out aBit, nBits);
     for (n = 0; n < nLen; n++)
     {
         if ((n % 8) == 0)
             bData = aBit[n / 8];
         if ((bData & (bOne << (byte)(n % 8))) != 0)
         {
             aData[n] = DBNull.Value;
         }
         else
         {
             switch (m_dts[n])
             {
                 case tagDataTypeSupported.dtBoolean:
                     {
                         bool myData;
                         UQueue.Load(out myData);
                         aData[n] = myData;
                     }
                     break;
                 case tagDataTypeSupported.dtByte:
                     {
                         byte myData;
                         UQueue.Load(out myData);
                         aData[n] = myData;
                     }
                     break;
                 case tagDataTypeSupported.dtChar:
                     {
                         char myData;
                         UQueue.Load(out myData);
                         aData[n] = myData;
                     }
                     break;
                 case tagDataTypeSupported.dtDateTime:
                     {
                         DateTime myData;
                         UQueue.Load(out myData);
                         aData[n] = myData;
                     }
                     break;
                 case tagDataTypeSupported.dtDecimal:
                     {
                         decimal myData;
                         UQueue.Load(out myData);
                         aData[n] = myData;
                     }
                     break;
                 case tagDataTypeSupported.dtDouble:
                     {
                         double myData;
                         UQueue.Load(out myData);
                         aData[n] = myData;
                     }
                     break;
                 case tagDataTypeSupported.dtFloat:
                     {
                         float myData;
                         UQueue.Load(out myData);
                         aData[n] = myData;
                     }
                     break;
                 case tagDataTypeSupported.dtGuid:
                     {
                         Guid myData;
                         UQueue.Load(out myData);
                         aData[n] = myData;
                     }
                     break;
                 case tagDataTypeSupported.dtInt16:
                     {
                         short myData;
                         UQueue.Load(out myData);
                         aData[n] = myData;
                     }
                     break;
                 case tagDataTypeSupported.dtInt32:
                     {
                         int myData;
                         UQueue.Load(out myData);
                         aData[n] = myData;
                     }
                     break;
                 case tagDataTypeSupported.dtInt64:
                     {
                         long myData;
                         UQueue.Load(out myData);
                         aData[n] = myData;
                     }
                     break;
                 case tagDataTypeSupported.dtUDT:
                 case tagDataTypeSupported.dtString:
                     {
                         string myData;
                         UQueue.Load(out myData);
                         aData[n] = myData;
                     }
                     break;
                 case tagDataTypeSupported.dtBytes:
                     {
                         byte[] buffer;
                         uint nBytes;
                         UQueue.Load(out nBytes);
                         UQueue.Pop(out buffer, nBytes);
                         aData[n] = buffer;
                     }
                     break;
                 case tagDataTypeSupported.dtUInt64:
                 case tagDataTypeSupported.dtUInt32:
                 case tagDataTypeSupported.dtUInt16:
                 case tagDataTypeSupported.dtValue:
                 case tagDataTypeSupported.dtValues:
                 case tagDataTypeSupported.dtTimeSpan:
                     UQueue.Load(out aData[n]);
                     break;
                 default:
                     throw new InvalidOperationException("Unsupported data type for serialization");
             }
         }
     }
     return (nSize - UQueue.GetSize());
 }
        private uint Pop(CUQueue UQueue, ref DataRow dr, ref DataRowState drs)
        {
            int n;
            bool b;
            string str;
            byte bData = 0;
            byte bOne = 1;
            if (m_dts == null)
                throw new ArgumentNullException("DataTable header is not de-serialized yet");
            uint nSize = UQueue.GetSize();
            if (dr == null)
                throw new ArgumentNullException("Datarow object can't be null");
            int nLen = m_dts.Length;
            if (dr.ItemArray == null || dr.ItemArray.Length != m_dts.Length)
                throw new InvalidOperationException("Wrong data row object");
            object[] aData = new object[nLen];
            uint nBits = (uint)(m_dts.Length / 8 + (((m_dts.Length % 8) != 0) ? 1 : 0));
            byte[] aBit = new byte[nBits];
            UQueue.Pop(out aBit, nBits);
            for (n = 0; n < nLen; n++)
            {
                if ((n % 8) == 0)
                    bData = aBit[n / 8];
                if ((bData & (bOne << (byte)(n % 8))) != 0)
                {
                    aData[n] = DBNull.Value;
                }
                else
                {
                    switch (m_dts[n])
                    {
                        case tagDataTypeSupported.dtBoolean:
                            {
                                bool myData;
                                UQueue.Load(out myData);
                                aData[n] = myData;
                            }
                            break;
                        case tagDataTypeSupported.dtByte:
                            {
                                byte myData;
                                UQueue.Load(out myData);
                                aData[n] = myData;
                            }
                            break;
                        case tagDataTypeSupported.dtChar:
                            {
                                char myData;
                                UQueue.Load(out myData);
                                aData[n] = myData;
                            }
                            break;
                        case tagDataTypeSupported.dtDateTime:
                            {
                                DateTime myData;
                                UQueue.Load(out myData);
                                aData[n] = myData;
                            }
                            break;
                        case tagDataTypeSupported.dtDecimal:
                            {
                                decimal myData;
                                UQueue.Load(out myData);
                                aData[n] = myData;
                            }
                            break;
                        case tagDataTypeSupported.dtDouble:
                            {
                                double myData;
                                UQueue.Load(out myData);
                                aData[n] = myData;
                            }
                            break;
                        case tagDataTypeSupported.dtFloat:
                            {
                                float myData;
                                UQueue.Load(out myData);
                                aData[n] = myData;
                            }
                            break;
                        case tagDataTypeSupported.dtGuid:
                            {
                                Guid myData;
                                UQueue.Load(out myData);
                                aData[n] = myData;
                            }
                            break;
                        case tagDataTypeSupported.dtUInt16:
                            {
                                ushort myData;
                                UQueue.Load(out myData);
                                aData[n] = myData;
                            }
                            break;
                        case tagDataTypeSupported.dtUInt32:
                            {
                                uint myData;
                                UQueue.Load(out myData);
                                aData[n] = myData;
                            }
                            break;
                        case tagDataTypeSupported.dtUInt64:
                            {
                                ulong myData;
                                UQueue.Load(out myData);
                                aData[n] = myData;
                            }
                            break;
                        case tagDataTypeSupported.dtInt16:
                            {
                                short myData;
                                UQueue.Load(out myData);
                                aData[n] = myData;
                            }
                            break;
                        case tagDataTypeSupported.dtInt32:
                            {
                                int myData;
                                UQueue.Load(out myData);
                                aData[n] = myData;
                            }
                            break;
                        case tagDataTypeSupported.dtInt64:
                            {
                                long myData;
                                UQueue.Load(out myData);
                                aData[n] = myData;
                            }
                            break;
                        case tagDataTypeSupported.dtUDT:
                        case tagDataTypeSupported.dtString:
                            {
                                string myData;
                                UQueue.Load(out myData);
                                aData[n] = myData;
                            }
                            break;
                        case tagDataTypeSupported.dtValue:
                        case tagDataTypeSupported.dtValues:
                        case tagDataTypeSupported.dtChars:
                        case tagDataTypeSupported.dtBytes:
                        case tagDataTypeSupported.dtTimeSpan:
                            UQueue.Load(out aData[n]);
                            break;
                        default:
                            throw new InvalidOperationException("Unsupported data type for serialization");
                    }
                }
            }
            dr.ItemArray = aData;

            UQueue.Load(out bData);
            drs = (DataRowState)bData;
            UQueue.Load(out b);
            if (b)
            {
                UQueue.Load(out str);
                dr.RowError = str;
            }

            return (nSize - UQueue.GetSize());
        }