Object 点网中的压缩对象

Object 点网中的压缩对象,object,compression,Object,Compression,我想在dotnet中压缩一个对象以减小其大小,然后在我的客户端应用程序中解压缩它 谢谢, Mrinal Jaiswal只需在类的上方添加以下内容即可将其序列化:也许可以看一看:以充分了解其工作原理 [Serializable] class Whatever 只需在类上方添加以下内容即可将其序列化:请看一看:以完全了解其工作原理 [Serializable] class Whatever 您可以随时使用它。您可以随时使用它。我想您需要通过压缩包含的数据来改进序列化过程。当我在.NET中需要它时

我想在dotnet中压缩一个对象以减小其大小,然后在我的客户端应用程序中解压缩它

谢谢,
Mrinal Jaiswal

只需在类的上方添加以下内容即可将其序列化:也许可以看一看:以充分了解其工作原理

[Serializable]
class Whatever

只需在类上方添加以下内容即可将其序列化:请看一看:以完全了解其工作原理

[Serializable]
class Whatever

您可以随时使用它。

您可以随时使用它。

我想您需要通过压缩包含的数据来改进序列化过程。当我在.NET中需要它时,我使用了SoapExtensions,但您也可以使用httpmodule的功能,如:

//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;
}

我想您需要通过压缩包含的数据来改进序列化过程。当我在.NET中需要它时,我使用了SoapExtensions,但您也可以使用httpmodule的功能,如:

//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;
}

我已经更新了代码,旧版本有问题

这是一个序列化、压缩的函数,反之亦然

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字节,那么就不需要压缩它们。您可以检查压缩比,看看您的对象是否需要压缩


另一个建议是,尝试压缩大量数据总是比单个压缩对象提供更好的压缩。

我已经更新了代码,旧版本有问题

这是一个序列化、压缩的函数,反之亦然

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字节,那么就不需要压缩它们。您可以检查压缩比,看看您的对象是否需要压缩


另一个建议是,尝试压缩大量数据总是比单个压缩对象提供更好的压缩。

请提供更多上下文。ASP.NET响应压缩?文件压缩?请提供更多上下文。ASP.NET响应压缩?文件压缩?嗨,阿凡,你的代码不起作用。它在返回bf.Deserializezs的行中给出异常;异常是在解析完成之前遇到了流的结尾,您能在这方面提供帮助吗?谢谢,Mrinal Jaiswaly告诉您GZipStream Flushfunction有问题。似乎需要先处理或关闭它,以便它可以完成对内存流的写入。无论如何,更新代码比旧版本好得多。嗨,阿凡,你的代码不起作用。它在返回bf.Deserializezs的行中给出异常;异常是在解析完成之前遇到了流的结尾,您能在这方面提供帮助吗?谢谢,Mrinal Jaiswaly告诉您GZipStream Flushfunction有问题。似乎需要先处理或关闭它,以便它可以完成对内存流的写入。无论如何,更新代码要比旧版本好得多。