将Arraylist <byte []>写入文件会产生无效结果(损坏数据)</byte []>

时间:2014-08-13 08:14:47

标签: c# list arraylist

我正在测试将chuncked数据写入文件。而且我遇到了某种“麻烦”我有一个包含在Arraylist / List中的一个chuncked byte []列表。但只有List-version似乎有效。 arraylist使用未知的编解码器生成一个文件(在本例中为wmv)(可能是由于数据损坏)。

  • 原始文件大小:294mb
  • 列出文件大小:294mb
  • Arraylist filesize:304mb ????? (10mb额外的来自哪里?)

没有抛出任何异常,我似乎无法找到问题的根源。有人可以帮助我吗?

两个列表都从同一个流中接收数据:

        int chunkSize = 1024;
        byte[] chunk = new byte[chunkSize];
        using (FileStream fileReader = new FileStream(@"C:\XXXX\someMovie.wmv", FileMode.Open, FileAccess.Read) )
        {


            BinaryReader binaryReader = new BinaryReader(fileReader);
            int bytesToRead = (int)fileReader.Length;
            do
            {
                chunk = binaryReader.ReadBytes(chunkSize);
                byteList.Add(chunk);
                bytesToRead -= chunk.Length;
            } while (bytesToRead > 0);

        }

工作列表版本(byteList = List<byte[]>)

        using (System.IO.FileStream _FileStream = new System.IO.FileStream(@"C:\XXXX\listTest.wmv", System.IO.FileMode.Create, System.IO.FileAccess.Write))
        {
            for (int i = 0; i < byteList.Count; i++)
            {
                _FileStream.Write(byteList[i], 0, byteList[i].Count());
            }
        }

无法工作 Arraylist-Version (byteList = Arraylist)

        using (System.IO.FileStream _FileStream = new System.IO.FileStream(@"C:\SIDJRGD\Zone afbakenen_2.wmv", System.IO.FileMode.Create, System.IO.FileAccess.Write))
        {
            for (int i = 0; i < byteList.Count; i++)
            {
                _FileStream.Write(ObjectToByteArray(byteList[i]), 0, ObjectToByteArray(byteList[i]).Length);
            }
        }

功能:ObjectToByteArray()(用于将Object投射到byte[]

private static byte[] ObjectToByteArray(Object obj)
{
    if (obj == null)
        return null;
    BinaryFormatter bf = new BinaryFormatter();
    MemoryStream ms = new MemoryStream();
    bf.Serialize(ms, obj);
    return ms.ToArray();
}

注意:我知道我可以使用List-solutionforget about the arraylist。但我只是好奇我可能做错了什么......

1 个答案:

答案 0 :(得分:1)

问题是您使用Serialize方法将Object转换为byte[]。 serialize方法对于序列化任何东西都很有用,而不仅仅是字节数组。因此,它使用额外的元数据打包数据以允许解码(您可以反序列化该数据,并且知道将其反序列化为字节数组)。

这些额外的数据显然不在原始字节数据中,因此这会破坏文件。

您可以将Object直接转换为字节数组。但是,List<T>通常首选Arraylist,因此我只使用List<byte[]>