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()); }