如何手动复制数组与Array.CopyTo()不同?

时间:2013-02-01 10:09:48

标签: c# asp.net .net

场景:我即将实现一个缓存功能,我想在其中缓存我从Web服务收到的序列化对象树。序列化对象以字节[]形式出现,我基本上只想创建第二个字节[],以便我想要恢复原始数据而不再查询Web服务。

问题:如果我使用简单的循环将源字节[]复制到目标字节[]中,例如:

for (int i = 0; i < source.Length - 1; i++)
   target[i] = source[i];

然后BinaryFormatter无法反序列化新的byte []。例外情况说:

  

二进制流'0'不包含有效的BinaryHeader。可能的原因是序列化和反序列化之间的无效流或对象版本更改。

但是如果我使用Buffer.BlockCopy()或Array.CopyTo()复制数组,那么BinaryFormatter对复制的byte []进行反序列化没有问题。

所以我的问题是,是否有人知道为什么以及如何在循环中复制该数组与使用这些函数不同?第一种方法中该字节[]究竟缺少什么?

2 个答案:

答案 0 :(得分:7)

看看这个:

for (int i = 0; i < source.Length - 1; i++)

除了最后一个字节之外,它正在复制。你想要:

for (int i = 0; i < source.Length; i++)

通过调用Clone()会更简单:

byte[] target = (byte[]) source.Clone();

答案 1 :(得分:0)

Array.CopyTo 与使用循环之间的主要区别在于, Array.CopyTo 调用直接在.NET CLR中实现的本机C ++方法。它还执行更深入的错误检测。

如果您只需要将数组复制到另一个数组,请使用 Array.CopyTo ,因为它在处理大型数组时会稍微加快一点。