private void SerializeDataSet(SerializationInfo info, StreamingContext context, SerializationFormat remotingFormat)
{
Debug.Assert(info != null);
info.AddValue("DataSet.RemotingVersion", new Version(2, 0));
// SqlHotFix 299, SerializationFormat enumeration types don't exist in V1.1 SP1
if (SerializationFormat.Xml != remotingFormat)
{
info.AddValue("DataSet.RemotingFormat", remotingFormat);
}
// SqlHotFix 299, SchemaSerializationMode enumeration types don't exist in V1.1 SP1
if (SchemaSerializationMode.IncludeSchema != SchemaSerializationMode)
{
//SkipSchemaDuringSerialization
info.AddValue("SchemaSerializationMode.DataSet", SchemaSerializationMode);
}
if (remotingFormat != SerializationFormat.Xml)
{
if (SchemaSerializationMode == SchemaSerializationMode.IncludeSchema)
{
//DataSet public state properties
SerializeDataSetProperties(info, context);
//Tables Count
info.AddValue("DataSet.Tables.Count", Tables.Count);
//Tables, Columns, Rows
for (int i = 0; i < Tables.Count; i++)
{
BinaryFormatter bf = new BinaryFormatter(null, new StreamingContext(context.State, false));
MemoryStream memStream = new MemoryStream();
bf.Serialize(memStream, Tables[i]);
memStream.Position = 0;
info.AddValue(string.Format(CultureInfo.InvariantCulture, "DataSet.Tables_{0}", i), memStream.GetBuffer());
}
//Constraints
for (int i = 0; i < Tables.Count; i++)
{
Tables[i].SerializeConstraints(info, context, i, true);
}
//Relations
SerializeRelations(info, context);
//Expression Columns
for (int i = 0; i < Tables.Count; i++)
{
Tables[i].SerializeExpressionColumns(info, context, i);
}
}
else
{
//Serialize DataSet public properties.
SerializeDataSetProperties(info, context);
}
//Rows
for (int i = 0; i < Tables.Count; i++)
{
Tables[i].SerializeTableData(info, context, i);
}
}
else
{
// old behaviour
string strSchema = GetXmlSchemaForRemoting(null);
string strData = null;
info.AddValue(KEY_XMLSCHEMA, strSchema);
StringBuilder strBuilder = new StringBuilder(EstimatedXmlStringSize() * 2);
StringWriter strWriter = new StringWriter(strBuilder, CultureInfo.InvariantCulture);
XmlTextWriter w = new XmlTextWriter(strWriter);
WriteXml(w, XmlWriteMode.DiffGram);
strData = strWriter.ToString();
info.AddValue(KEY_XMLDIFFGRAM, strData);
}
}