小编MrW*_*Wuf的帖子

来自其内部StringBuilder调用的BinaryFormatter.Deserialize的OutOfMemory异常

我有一个.NET 4 WCF服务,它向客户端发送一些由客户端反序列化的大对象(~115Mb).对象第一次进入时反序列化很好.但是,所有后续调用都会抛出一个OutOfMemoryException.我已经检查过以确保我所有人IDisposables都被包裹起来using.我查看了与此类似的其他问题,例如BinaryFormatter outofmemory异常反序列化 来自MemoryStream的Deserialize在C#中抛出OutOfMemory异常 .我尝试了一些人们推荐的解决方案,包括使用Simon Hewitt的Optimized Serializer.但是,最后,他仍然依赖于BinaryFormatter反序列化对象.

我抓住了OutOfMemoryException并查看了堆栈跟踪(见下文).跟踪似乎源于StringBuilder类中内存利用率的问题.我读过其他文章,关于如何StringBuilder在需要更多空间时使用(长度*2)算法导致内存问题.

at System.Text.StringBuilder.ToString()    
at System.IO.BinaryReader.ReadString()    
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectString(BinaryHeaderEnum binaryHeaderEnum)    
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()    
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)    
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)    
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)
Run Code Online (Sandbox Code Playgroud)

有没有办法以BinaryFormatter不同的方式工作而不使用StringBuilder或是否有更好的替代方案来BinaryFormatter更好地管理内存?

c# stringbuilder out-of-memory binaryformatter deserialization

5
推荐指数
1
解决办法
2323
查看次数

Clipboard.GetImage()返回null

我有一个DataGridView包含一个Image列和一些文本列.我有一个非常简单的处理程序,允许用户从单元格中复制文本或图像,并将图像和文本粘贴到它们中.复制/粘贴在文本上正常工作,但粘贴不适用于图像.(注意:如果我粘贴从另一个应用程序放置在剪贴板上的图像,如Paint,那么它工作正常)

如果我立即调用它Clipboard.GetImage()Clipboard.SetImage()它工作正常,这使我相信它可能是一个范围问题或者Clipboard是从图像中获取引用而不是底层字节.我是否必须将原始图像字节放在共享位置?我检查了GetImageMSDN定义,以确保我正确地执行了它.

    private void dataGridView_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
        {
            if (Clipboard.ContainsImage())
            {
                Image img = Clipboard.GetImage();  // always returns null

                if (cell.ColumnIndex == _imageCol)
                    cell.Value = img;
            }

            if (Clipboard.ContainsText())
            {
                if (cell.ColumnIndex != _imageCol)
                    cell.Value = Clipboard.GetText(); // always works
            }
        }

        if (e.KeyCode == Keys.C && e.Modifiers == Keys.Control)
        {
            DataGridViewCell cell = dataGridView1.SelectedCells[0];

            if …
Run Code Online (Sandbox Code Playgroud)

c# clipboard winforms

3
推荐指数
1
解决办法
883
查看次数

如何从SQL Server Compact获取PK信息

我的公司正在使用SQL Server Compact来存储和管理本地数据库,我需要从数据库表中获取主键信息.

OleDbConnection.GetSchema()过去曾使用Jet和OLE驱动程序从Access数据库中获取此信息.但它似乎SqlCeConnection.GetSchema()抛出一个NotImplementedException(或者更确切地说它返回DBConnection.GetSchema()抛出相同的异常).

我不需要通常返回的所有信息GetSchema(),只需要PK的名称.有没有找到SQL Server Compact数据库中表的主键的好方法?

注意:上述方法引用不是静态函数调用.将类名视为该类型的对象引用.

c# sql-server-ce

2
推荐指数
1
解决办法
1110
查看次数