0

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

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

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

那么 BinaryFormatter 无法反序列化该新字节 []。异常说:

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

但是,如果我使用 Buffer.BlockCopy() 或 Array.CopyTo() 复制数组,则 BinaryFormatter 反序列化复制的字节 [] 没有问题。

所以我的问题是,有谁知道为什么以及如何在循环中复制该数组与使用这些函数不同?在第一种方法中,那个 byte[] 到底缺少什么?

4

2 回答 2

7

看这个:

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

那就是复制除了最后一个字节之外的所有内容。你要:

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

只是调用会更简单Clone()

byte[] target = (byte[]) source.Clone();
于 2013-02-01T10:10:33.530 回答
0

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

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

于 2013-02-01T11:29:26.117 回答