【问题标题】:BinaryFormatter.Deserlize for a Bitmap rases a System.OutOfMemoryException位图的 BinaryFormatter.Deserlize 引发 System.OutOfMemoryException
【发布时间】:2017-11-21 23:13:57
【问题描述】:

所以 .. 我正在创建一个 Simple Desktop Viewer 应用程序。

但是当我尝试反序列化通过流发送的图像时,我不断收到此 System.outOfMmemoryException。

发送代码:

 private Image getScreen() {

        Rectangle bound = Screen.PrimaryScreen.Bounds;
        Bitmap ScreenShot = new Bitmap(bound.Width,bound.Height,PixelFormat.Format32bppArgb );
        Graphics image = Graphics.FromImage(ScreenShot);
        image.CopyFromScreen(bound.X,bound.Y,0,0,bound.Size,CopyPixelOperation.SourceCopy);
        return ScreenShot;
    }
    private void SendImage() {
        BinaryFormatter binFormatter = new BinaryFormatter();
        binFormatter.Serialize(stream, getScreen());
    }

请注意,图像是使用一个计时器发送的,该计时器一旦启动就会调用 SendImage()

这是我的接收代码:

 BinaryFormatter binFormatter = new BinaryFormatter();
                Image img = (Image)binFormatter.Deserialize(stream);
                picturebox1.Image=img;

所以..怎么了?

【问题讨论】:

  • “所以..怎么了?”你可能内存不足。正如错误所说。
  • 好的,请问如何解决?
  • 如果我理解正确,您是在尝试编写某种“远程桌面”程序吗?这个话题实在是太宽泛了,无法在 Stack Overflow 上讨论。
  • 我猜是这样,但我并不是真的想讨论它,只是想找出这段代码有什么问题,以及如何解决它。
  • .NET 程序员倾向于忽略 Dispose() 方法,他们可以保持一段时间。在他们开始使用 Image 或 Bitmap 之前,这是一个用于大量非托管内存的非常小的 .NET 包装器。 SendImage() 需要使用using 语句,以便正确处理 getScreen() 的返回值。

标签: c# tcpclient networkstream tcpserver binaryformatter


【解决方案1】:

这很可能是由错误使用 Stream 引起的。下面的代码工作正常:

private Image getScreen() {
    Rectangle bound = Screen.PrimaryScreen.Bounds;
    Bitmap ScreenShot = new Bitmap(bound.Width,bound.Height,PixelFormat.Format32bppArgb );
    Graphics image = Graphics.FromImage(ScreenShot);
    image.CopyFromScreen(bound.X,bound.Y,0,0,bound.Size,CopyPixelOperation.SourceCopy);
    return ScreenShot;
}
private void SendImage(Stream stream) {
    BinaryFormatter binFormatter = new BinaryFormatter();
    binFormatter.Serialize(stream, getScreen());
}

void Main()
{
    byte[] bytes = null;
    using (var ms = new MemoryStream()) {
        SendImage(ms);
        bytes = ms.ToArray();
    }

    var receivedStream = new MemoryStream(bytes);
    BinaryFormatter binFormatter = new BinaryFormatter();
    Image img = (Image)binFormatter.Deserialize(receivedStream);
    img.Save("c:\\temp\\test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}

【讨论】:

  • 嗯,问题是,正在使用的流是从客户端和服务器之间的 TCP 连接获取的 NetworkStream,我将编辑问题并添加 TCP 部分
  • 在这种情况下,你需要从中读取所有字节,然后反序列化字节数组。
  • 谢谢老兄,我应该早点说清楚,这是一个聊天应用程序的一部分,用户可以在触发事件后共享他们的桌面视图,我尝试只使用桌面视图启动连接工作它似乎是流的问题,我怎样才能“清理”或“重置”它到连接后的状态?
  • "在这种情况下,您需要从中读取所有字节,然后反序列化字节数组",我该怎么做?
猜你喜欢
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 2013-01-14
  • 2013-08-28
  • 2015-07-18
相关资源
最近更新 更多