如何减少上传到webservice的内容长度
假设我有一个方法,
[WebMethod]
public string DoCommand(string pCommandName,string pParameter)
{
return "ER|建议中";
}
public string DoCommand(string pCommandName,string pParameter)
{
return "ER|建议中";
}
他做很多的工作。并会根据pCommandName的不同来使用pParameter,pParameter有可能是一个对象的XML序列化的字符串。当一个对象很大时,如一个集合,我很担心上传的流量。我想到了压缩、二进制序列化、字节来改动上面的方法。
首先尝试改为字节参数
[WebMethod]
public string DoCommand(string pCommandName,byte[] pParameter)
{
return "ER|建议中";
}
public string DoCommand(string pCommandName,byte[] pParameter)
{
return "ER|建议中";
}
使用TCP跟踪器,发现pParameter传送的base64的字符串,看来是框架自己加了处理。好了,那就看看压缩XML字符串和二进制序列化的比较了。
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
//测试数据
List<EntityTest> ens = new List<EntityTest>();
for (int i = 0; i < 50; i++)
ens.Add(new EntityTest());
//转换为字符
string xmlStr = XmlSeriTool.Serialize(ens);
string binStr = ZipTools.GetBinaryBase64(ens);
string xmlDstr = ZipTools.GZipCompress(xmlStr);
string binDstr = ZipTools.GZipCompress(binStr);
this.richTextBox1.AppendText(string.Format("XML字长:{0}\nBIN字长:{1}\n压缩XML字长:{2}\n压缩BIN字长:{3}",
xmlStr.Length,
binStr.Length,
xmlDstr.Length,
binDstr.Length));
List<EntityTest> ens = new List<EntityTest>();
for (int i = 0; i < 50; i++)
ens.Add(new EntityTest());
//转换为字符
string xmlStr = XmlSeriTool.Serialize(ens);
string binStr = ZipTools.GetBinaryBase64(ens);
string xmlDstr = ZipTools.GZipCompress(xmlStr);
string binDstr = ZipTools.GZipCompress(binStr);
this.richTextBox1.AppendText(string.Format("XML字长:{0}\nBIN字长:{1}\n压缩XML字长:{2}\n压缩BIN字长:{3}",
xmlStr.Length,
binStr.Length,
xmlDstr.Length,
binDstr.Length));
结果很有意思,如下:
XML字长:13280
BIN字长:9252
压缩XML字长:4868
压缩BIN字长:7024
BIN字长:9252
压缩XML字长:4868
压缩BIN字长:7024
将对象序列化为XML的长度最长。先将对象执行二进制序列化,再取字节的Base64字符的长度,比直接XML序列化短2000多字。但把这两个字符用zip压缩后,两者都短了,但XML的字符更短!
我很乐意看到这个结果,毕竟使用XML序列化灵活一些。