各位大侠:小弟我做的是一个CSS结构的项目,现在需要把查询SQL语句放在服务端WebService上执行,然后把查询结果以DataSet的形式返回給客户端,为了节省传输的字节数,现在我考虑用zlib来压缩和解压缩.现在的问题是我在服务端序列化DataSet为二进制流后压缩传输給客戶端,客戶端解压缩后居然与服务端的字节数不同.请问大侠这是什么原因.以下是我的代码.
服务端:
[WebMethod(Description = "调用Zlib循环获取远程DATASET")]
public byte[] ZlibReadTable(string sql)
{
DataSet ds = new DataSet();
string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
SqlConnection myConn = new SqlConnection(connectionString);
SqlDataAdapter myAdapter = new SqlDataAdapter(sql, myConn);
myConn.Open();
myAdapter.Fill(ds);
myConn.Close();
Stream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, ds);
Stream msResult = new MemoryStream();
zlib.ZOutputStream ZOS = new zlib.ZOutputStream(msResult, zlib.zlibConst.Z_DEFAULT_COMPRESSION);
ms.Position = 0;
CopyStream(ms, ZOS);
byte[] buffer = new byte[msResult.Length];
msResult.Position = 0;
msResult.Read(buffer, 0, buffer.Length); ZOS.Close();
ms.Close();
msResult.Close();
return buffer;
}
private static void CopyStream(System.IO.Stream input, System.IO.Stream output)
{
byte[] buffer = new byte[2000];
int len;
while ((len = input.Read(buffer, 0, 2000)) > 0)
{
output.Write(buffer, 0, len);
}
output.Flush();
}客戶端:
private DataSet GetZlibBinaryData(string sql)
{
GetDataSet.Service svc = new DSClient.GetDataSet.Service();
byte[] bb = svc.ZlibReadTable(sql);
Stream br = new MemoryStream(bb); Stream ms = new MemoryStream();
zlib.ZOutputStream ZOS = new zlib.ZOutputStream(ms);
ZOS.Write(bb, 0, bb.Length);
br.Position = 0;
CopyStream(br, ZOS);
IFormatter bf = new BinaryFormatter();
ms.Position = 0;
object obj = bf.Deserialize(ms);
DataSet ds = (DataSet)obj;
ms.Close();
ZOS.Close();
return ds;
}
private static void CopyStream(System.IO.Stream input, System.IO.Stream output)
{
byte[] buffer = new byte[2000];
int len;
while ((len = input.Read(buffer, 0, 2000)) > 0)
{
output.Write(buffer, 0, len);
}
output.Flush();
}
望某位大侠能解救小弟!!!感激不尽.
服务端:
[WebMethod(Description = "调用Zlib循环获取远程DATASET")]
public byte[] ZlibReadTable(string sql)
{
DataSet ds = new DataSet();
string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
SqlConnection myConn = new SqlConnection(connectionString);
SqlDataAdapter myAdapter = new SqlDataAdapter(sql, myConn);
myConn.Open();
myAdapter.Fill(ds);
myConn.Close();
Stream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, ds);
Stream msResult = new MemoryStream();
zlib.ZOutputStream ZOS = new zlib.ZOutputStream(msResult, zlib.zlibConst.Z_DEFAULT_COMPRESSION);
ms.Position = 0;
CopyStream(ms, ZOS);
byte[] buffer = new byte[msResult.Length];
msResult.Position = 0;
msResult.Read(buffer, 0, buffer.Length); ZOS.Close();
ms.Close();
msResult.Close();
return buffer;
}
private static void CopyStream(System.IO.Stream input, System.IO.Stream output)
{
byte[] buffer = new byte[2000];
int len;
while ((len = input.Read(buffer, 0, 2000)) > 0)
{
output.Write(buffer, 0, len);
}
output.Flush();
}客戶端:
private DataSet GetZlibBinaryData(string sql)
{
GetDataSet.Service svc = new DSClient.GetDataSet.Service();
byte[] bb = svc.ZlibReadTable(sql);
Stream br = new MemoryStream(bb); Stream ms = new MemoryStream();
zlib.ZOutputStream ZOS = new zlib.ZOutputStream(ms);
ZOS.Write(bb, 0, bb.Length);
br.Position = 0;
CopyStream(br, ZOS);
IFormatter bf = new BinaryFormatter();
ms.Position = 0;
object obj = bf.Deserialize(ms);
DataSet ds = (DataSet)obj;
ms.Close();
ZOS.Close();
return ds;
}
private static void CopyStream(System.IO.Stream input, System.IO.Stream output)
{
byte[] buffer = new byte[2000];
int len;
while ((len = input.Read(buffer, 0, 2000)) > 0)
{
output.Write(buffer, 0, len);
}
output.Flush();
}
望某位大侠能解救小弟!!!感激不尽.
解决方案 »
- 简单的问题
- DLL数据类型问题
- winform读取了txt文件,用clickone发布时,txt文件的路径在什么地方呢?
- 要文本框中实现类似VS的点出功能.大家有什么好的算法
- 证则表达式..............
- C#将文本框TEXTBOX的值赋给网页控件webbower中的变量,用BUTTON再调用网页中的函数
- Vs2003Msdn安装以后能在安装Vs2005Msdn吗?
- 浏览事件中能读取文件,可没有路径,textbox中是空白的
- 关于ServerVariables的问题
- 找不到类型或命名空间名称“MyChatRoom”(是否缺少 using 指令或程序集引用?)
- 主窗体失去焦点
- 怎样将两张jpg类型的图片混合后再导出?
/// 压缩数据集
/// </summary>
/// <param name="ds"></param>
/// <returns></returns>
public static byte[] CompressDS(DataSet ds)
{
MemoryStream ms = new MemoryStream();
ZipOutputStream zos = new ZipOutputStream(ms);
zos.PutNextEntry(new ZipEntry(ds.DataSetName));
BinaryFormatter bf = new BinaryFormatter();
DataSetSurrogate dss = new DataSetSurrogate(ds);
bf.Serialize(zos, dss);
zos.CloseEntry();
zos.Close();
byte[] ret = ms.ToArray();
ms.Close();
return ret;
} /// <summary>
/// 解压数据集
/// </summary>
/// <param name="byt"></param>
/// <returns></returns>
public static DataSet DecompressDS(byte[] byt)
{
MemoryStream ms = new MemoryStream(byt);
BinaryFormatter bf = new BinaryFormatter();
ZipInputStream zis = new ZipInputStream(ms);
zis.GetNextEntry();
DataSetSurrogate dss = (DataSetSurrogate)bf.Deserialize(zis);
zis.Close();
ms.Close();
DataSet ds = dss.ConvertToDataSet();
return ds;
} 建议LZ用GZip,BZip压缩算法结合序列化传输数据,比Zip快
没发现有问题。但是上个项目用WebService的时候,会把串行化的字符串中的\r\n变成\n
这样字符长度就变少了。
是不是你的WebService也对chr(13)和chr(10)做什么特殊处理?