好的,我知道所有的LOH和大对象(大于85k)和进入LOH的大列表(更多40k元素)。
所以我的问题是,我需要知道在使用XMLSerialiser序列化时列表的大小(我不关心它在内存中占用的空间或类似的事情,我只想知道它在序列化时的大小),但是如果我试图序列化一个包含大元素的大列表,我就会得到OutOfMemoryException (我知道为什么)
我想知道的是:是否可以按元素序列化列表元素,并在循环中累加它的大小,比如://,这将是伪代码
long byteLength = 0;
using(stream)
{
foreach(element in MyList)
{
MemoryStream.Serialise(element);
byteLength += MemoryStream.Length;
MemoryStream.Clear();
}
}
有什么建议吗?
更新:@xanatos解决方案执行我想做的事情,因为它没有在ram中添加一个将存储在LOH中的大型byte[]
正如@Hans Passant所说,我为什么要做这种处理的目的似乎很重要:我想知道一个以XML序列化的列表的字节大小,以便能够根据它的总字节在磁盘上的多个文件中拆分列表。
发布于 2013-08-16 08:06:08
如果你只需要长度:
class NulStream : Stream
{
public override bool CanRead
{
get { return false; }
}
public override bool CanSeek
{
get { return false; }
}
public override bool CanWrite
{
get { return true; }
}
public override void Flush()
{
}
protected long length;
public override long Length
{
get { return this.length; }
}
public override long Position
{
get
{
return this.length;
}
set
{
throw new NotSupportedException();
}
}
public override int Read(byte[] buffer, int offset, int count)
{
throw new NotSupportedException();
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException();
}
public override void SetLength(long value)
{
throw new NotSupportedException();
}
public override void Write(byte[] buffer, int offset, int count)
{
this.length += count;
}
}
using (var nul = new NulStream())
{
xml.Serialize(nul, lst);
long length = nul.Length;
}
这是一条裸体小溪..。就像NUL文件:-)它会吃掉你扔给它的东西,并且只保存累积长度。
注意,从技术上讲,我可以实现SetLength
,而Write
应该检查它的参数.但为什么?:-)
https://stackoverflow.com/questions/18277279
复制