我想压缩点网中的对象以减小其大小,然后在我的客户端应用程序中解压缩它。
谢谢, Mrinal Jaiswal
答案 0 :(得分:5)
我已更新代码,旧版本存在问题。
这是一个序列化和压缩的函数,反之亦然。
public static byte[] SerializeAndCompress(object obj) {
using (MemoryStream ms = new MemoryStream()) {
using (GZipStream zs = new GZipStream(ms, CompressionMode.Compress, true)) {
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(zs, obj);
}
return ms.ToArray();
}
}
public static object DecompressAndDeserialze(byte[] data) {
using (MemoryStream ms = new MemoryStream(data)) {
using (GZipStream zs = new GZipStream(ms, CompressionMode.Decompress, true)) {
BinaryFormatter bf = new BinaryFormatter();
return bf.Deserialize(zs);
}
}
}
以下是如何使用它。
[Serializable]
class MyClass
{
public string Name { get; set; }
}
static void Main(string[] args) {
MyClass myClassInst = new MyClass();
myClassInst.Name = "Some Data";
byte[] data= SerializeAndCompress(myClassInst);
MyClass desInst = (MyClass)DecompressAndDeserialze(data);
}
但压缩有一个问题。请记住,上面的示例对象序列化为153字节,但压缩版本为266字节,原因是如果具有较少数据的小对象,则gzip头信息和压缩头将至少占用120字节。因此,如果你的对象足够大而不是压缩它们,如果它们只需要300字节左右就不需要压缩它们。您可以检查压缩比,看看您是否反对甚至需要压缩。
尝试压缩大量数据的另一个建议总是会对单个压缩对象提供更好的压缩。
答案 1 :(得分:1)
您可以随时GZip。
答案 2 :(得分:0)
我认为您需要通过压缩包含的数据来改进序列化过程。一旦我在.NET中需要它,我就使用了SoapExtensions,但您也可以使用httpsodule的功能,例如msdn:
//overriding the GetWebRequest method in the Web service proxy
protected override WebRequest GetWebRequest(Uri uri)
{
WebRequest request = base.GetWebRequest(uri);
request.Headers.Add("Accept-Encoding", "gzip, deflate");
return request;
}
//overriding the GetWebResponse method in the Web service proxy
protected override WebResponse GetWebResponse(WebRequest request)
{
//decompress the response from the Web service
return response;
}
答案 3 :(得分:-1)
只需在课程上方添加以下内容即可对其进行序列化:(可以查看:http://blog.kowalczyk.info/article/Serialization-in-C.html以完全了解其工作原理。)
[Serializable]
class Whatever