internal void SerializeTableData(SerializationInfo info, StreamingContext context, int serIndex)
{
//Cache all the column count, row count
int colCount = Columns.Count;
int rowCount = Rows.Count;
int modifiedRowCount = 0;
int editRowCount = 0;
//Compute row states and assign the bits accordingly - 00[Unchanged], 01[Added], 10[Modifed], 11[Deleted]
BitArray rowStates = new BitArray(rowCount * 3, false); //All bit flags are set to false on initialization of the BitArray.
for (int i = 0; i < rowCount; i++)
{
int bitIndex = i * 3;
DataRow row = Rows[i];
DataRowState rowState = row.RowState;
switch (rowState)
{
case DataRowState.Unchanged:
//rowStates[bitIndex] = false;
//rowStates[bitIndex + 1] = false;
break;
case DataRowState.Added:
//rowStates[bitIndex] = false;
rowStates[bitIndex + 1] = true;
break;
case DataRowState.Modified:
rowStates[bitIndex] = true;
//rowStates[bitIndex + 1] = false;
modifiedRowCount++;
break;
case DataRowState.Deleted:
rowStates[bitIndex] = true;
rowStates[bitIndex + 1] = true;
break;
default:
throw ExceptionBuilder.InvalidRowState(rowState);
}
if (-1 != row._tempRecord)
{
rowStates[bitIndex + 2] = true;
editRowCount++;
}
}
//Compute the actual storage records that need to be created.
int recordCount = rowCount + modifiedRowCount + editRowCount;
//Create column storages.
ArrayList storeList = new ArrayList();
ArrayList nullbitList = new ArrayList();
if (recordCount > 0)
{
//Create the storage only if have records.
for (int i = 0; i < colCount; i++)
{
object store = Columns[i].GetEmptyColumnStore(recordCount);
storeList.Add(store);
BitArray nullbits = new BitArray(recordCount);
nullbitList.Add(nullbits);
}
}
//Copy values into column storages
int recordsConsumed = 0;
Hashtable rowErrors = new Hashtable();
Hashtable colErrors = new Hashtable();
for (int i = 0; i < rowCount; i++)
{
int recordsPerRow = Rows[i].CopyValuesIntoStore(storeList, nullbitList, recordsConsumed);
GetRowAndColumnErrors(i, rowErrors, colErrors);
recordsConsumed += recordsPerRow;
}
IFormatProvider formatProvider = CultureInfo.InvariantCulture;
//Serialize all the computed values.
info.AddValue(string.Format(formatProvider, "DataTable_{0}.Rows.Count", serIndex), rowCount);
info.AddValue(string.Format(formatProvider, "DataTable_{0}.Records.Count", serIndex), recordCount);
info.AddValue(string.Format(formatProvider, "DataTable_{0}.RowStates", serIndex), rowStates);
info.AddValue(string.Format(formatProvider, "DataTable_{0}.Records", serIndex), storeList);
info.AddValue(string.Format(formatProvider, "DataTable_{0}.NullBits", serIndex), nullbitList);
info.AddValue(string.Format(formatProvider, "DataTable_{0}.RowErrors", serIndex), rowErrors);
info.AddValue(string.Format(formatProvider, "DataTable_{0}.ColumnErrors", serIndex), colErrors);
}