为什么要用BinaryFormatter序列化DataSet呢?可以直接用DataSet.WriteXml方法嘛。
/// <summary>
/// 将指定DataTable转换为其等效的Xml流形式。
/// </summary>
/// <param name="table">DataTable对象</param>
/// <returns></returns>
public string ToXmlString(DataTable table)
{
if(table == null)
{
return null;
} StringBuilder content = new StringBuilder();
StringWriter writer = new StringWriter(content);
XmlTextWriter xmlWriter = new XmlTextWriter(writer); try
{
DataSet ds = new DataSet();
ds.Tables.Add(table.Copy());
ds.WriteXml(xmlWriter); return content.ToString();
}
finally
{
writer.Close();
xmlWriter.Close();
}
}/// <summary>
/// 将指定的Xml流转换为其等效的DataSet对象。
/// </summary>
/// <param name="xmlStream">Xml流</param>
/// <returns></returns>
public DataSet ToDataSet(string xmlStream)
{
if(xmlStream == null || xmlStream.Trim().Length == 0)
{
return null;
} StringReader reader = new StringReader(xmlStream);
XmlTextReader xmlReader = new XmlTextReader(reader);
try
{
DataSet ds = new DataSet();
ds.ReadXml(xmlReader);
return ds;
}
finally
{
reader.Close();
xmlReader.Close();
}
}
/// <summary>
/// 将指定DataTable转换为其等效的Xml流形式。
/// </summary>
/// <param name="table">DataTable对象</param>
/// <returns></returns>
public string ToXmlString(DataTable table)
{
if(table == null)
{
return null;
} StringBuilder content = new StringBuilder();
StringWriter writer = new StringWriter(content);
XmlTextWriter xmlWriter = new XmlTextWriter(writer); try
{
DataSet ds = new DataSet();
ds.Tables.Add(table.Copy());
ds.WriteXml(xmlWriter); return content.ToString();
}
finally
{
writer.Close();
xmlWriter.Close();
}
}/// <summary>
/// 将指定的Xml流转换为其等效的DataSet对象。
/// </summary>
/// <param name="xmlStream">Xml流</param>
/// <returns></returns>
public DataSet ToDataSet(string xmlStream)
{
if(xmlStream == null || xmlStream.Trim().Length == 0)
{
return null;
} StringReader reader = new StringReader(xmlStream);
XmlTextReader xmlReader = new XmlTextReader(reader);
try
{
DataSet ds = new DataSet();
ds.ReadXml(xmlReader);
return ds;
}
finally
{
reader.Close();
xmlReader.Close();
}
}
你的那个方法我已经实现,但这个方法只能保存数据,不能保存状态,当dataset从一台机器传到另一台机器时,dataset的原来所有状态都消失了,全部都还原为默认状态。
所以我才想到要将dataset序列化,这样可以保存所有的状态。
/// <summary>
/// 将对象或具有指定顶级(根)的对象图形序列化为给定流
/// </summary>
/// <param name="sourceObject">位于要序列化图形的根位置的对象</param>
/// <returns></returns>
public MemoryStream Serialize(object sourceObject)
{
using(MemoryStream stream = new MemoryStream())
{
formatter.Serialize(stream, sourceObject);
return stream;
}
}/// <summary>
/// 将流反序列化为对象图形
/// </summary>
/// <param name="stream">将指定的流反序列化为对象图形</param>
/// <returns></returns>
public object Deserialize(MemoryStream stream)
{
return formatter.Deserialize(stream);
}/// <summary>
/// 将流反序列化为对象图形
/// </summary>
/// <param name="stream">将指定的流反序列化为对象图形</param>
/// <returns></returns>
public static object Deserialize(byte[] stream)
{
return formatter.Deserialize(new MemoryStream(stream));
}
// formatter为BinaryFormatter对象。
/// 将字节数组转换成字符串
/// </summary>
/// <param name="sourceArray">字节数组</param>
/// <returns></returns>
public string ByteArrayToString(byte[] sourceArray)
{
Encoding encoding = Encoding.GetEncoding("Gb2312"); return encoding.GetString(sourceArray);
}
public string ByteArrayToString(byte[] sourceArray)
{
Encoding encoding = Encoding.GetEncoding("Gb2312"); return encoding.GetString(sourceArray);
}
得到的string如何还原成datatable呢?
//在这之前已经有一个[Serializable]标记的类了
//然后声明一个可以序列化的对象
sd=new serializable();
sd.ds=ds;
//进行Xml格式的序列化
XmlSerializer mySerializer = new XmlSerializer(typeof(serializable));
//将对象sd序列化到内存流
System.IO.MemoryStream myWriter = new MemoryStream();
mySerializer.Serialize(myWriter, sd);
//返回
return myWriter.GetBuffer();