webservice---序列化和反序列化(针对网上DataSet优化)
(1)直接返回DataSet对象
(2)返回DataSet对象用Binary序列化后的字节数组
(3)返回DataSetSurrogate对象用Binary序列化后的 字节数组
(4)返回DataSetSurrogate对象用Binary序列化并Zip 压缩后的字节数组
DataSetSurrogate 类为微软在2.0的时候提供的压缩DataSet的类,下载/Files/fujinliang/DataSetSurrogate.rar
代码如下:
[WebMethod(Description = "直接返回DataSet对象")]
public DataSet GetDataSet()
{
string connStr = System.Configuration.ConfigurationManager.AppSettings["ConnString"].ToString();
SqlConnection conn = new SqlConnection(connStr);
string sql = "select * from Base_Dic";
conn.Open();
SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
DataSet ds = new DataSet("China");
sda.Fill(ds);
conn.Close();
return ds;
}
[WebMethod(Description = "直接返回DataSet对象,并用Binary序列化后的字节数组")]
public byte[] GetDataSetBytes()
{
DataSet ds = GetDataSet();
BinaryFormatter ser = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
ser.Serialize(ms, ds);
byte[] buffer = ms.ToArray();
return buffer;
}
[WebMethod(Description = "直接返回DataSetSurrogate对象,并且Binary序列化后的字节数组")]
public byte[] GetDataSetSurrogateBytes()
{
DataSet ds = GetDataSet();
DataSetSurrogate dss = new DataSetSurrogate(ds);
BinaryFormatter ser = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
ser.Serialize(ms, dss);
byte[] buffer = ms.ToArray();
return buffer;
}
[WebMethod(Description="直接返回DataSetSurrogate对象,并且binary序列化后并且zip压缩的字节数组")]
public byte[] GetDataSetSurrogateZipBytes()
{
DataSet ds = GetDataSet();
DataSetSurrogate dss = new DataSetSurrogate(ds);
BinaryFormatter ser = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
ser.Serialize(ms, dss);
byte[] buffer = ms.ToArray();
byte[] bufferZip = ComPress(buffer);
return bufferZip;
}
//压缩方法
public byte[] ComPress(byte[] data)
{
try
{
MemoryStream ms = new MemoryStream();
Stream zipStream = null;
zipStream = new GZipStream(ms, CompressionMode.Compress, true);
zipStream.Write(data, 0, data.Length);
zipStream.Close();
ms.Position = 0;
byte[] compressed_data = new byte[ms.Length];
ms.Read(compressed_data, 0, int.Parse(ms.Length.ToString()));
return compressed_data;
}
catch
{
return null;
}
}
上面的代码在网上比较多,经过测试也确实能优化实体的传输,上面测试的数据如下:
(1)直接返回DataSet对象
速度为00:00:01.
(2)返回DataSet对象用Binary序列化后的字节数组
速度比(1)快,传输的大小为30589
(3)返回DataSetSurrogate对象用Binary序列化后的 字节数组
速度比(1)快,传输的大小为12450
(4)返回DataSetSurrogate对象用Binary序列化并Zip 压缩后的字节数组
速度比(1)快,传输的大小为4540
这四种方式第2,3,4的速度差不多,不过我的数据量不大,在数据量大的情况下,这种优势将更新明显,所以建议用(4)种方式来增加实体实例化的性能
上面的例子只是针对DataSet进行相关的优化,我们知道在webservice中如果直接使用复合类型,将产生大量的wsdl描述信息,这样生成的xml将是很大的,
为了优化webservice的复合类型,最后还是对其进行序列化传输,序列化传输,使用的类库在客户端和服务端必须一样,必须标志为[Serialization],不然将会报错,上面的DataSetSurrogate必须新建一个类库,在客户端和服务端引用
对于其他的实体对象,我们也可以通过序列化来实现复合类型
缺点:webservice为不同的语言之间的调用提供了一个快速便捷的方法,但在跨平台的情况下,因为序列化和反序列化对二进制进行转换的方式不一样,所以此种功能将会受到限制,看具体平台的业务要求而定。
例子程序:服务端/Files/fujinliang/WebService.rar