2017-03-07 57 views
1

我正在使用以下代码从dataTable序列化数据。用二进制读取器逐行读取

var rows = new List<Dictionary<string, object[]>>(); 

我从DataTable中填充行并将它们放在Dictionary中。不要问为什么:)

using(var fileStream = new FileStream(@"D:\temp.bin", FileMode.Create, FileAccess.Write, FileShare.None)) 
using(var bw = new BinaryWriter(fileStream)) 
{ 
    foreach(Dictionary<string, object[]> row in rows) 
    { 
     byte[] bytes = ObjectToByteArray(row); 
     bw.Write(bytes); 
    } 
} 

采用以下方法:

private static byte[] ObjectToByteArray(Dictionary<string, object[]> rows) 
{ 
    var bf = new BinaryFormatter(); 
    using(var ms = new MemoryStream()) 
    { 
     bf.Serialize(ms, rows); 
     return ms.ToArray(); 
    } 
} 

我所试图做的是反序列化一行行,如果这是可能的BinaryReader在。问题是我坚持只读第一行。

我想什么实现的是:

using(BinaryReader reader = new BinaryReader(File.Open(@"D:\temp.bin", FileMode.Open))) 
{ 
    int pos = 0; 
    int length = (int)reader.BaseStream.Length; 
    while(pos < length) 
    { 
     byte[] v = reader.ReadBytes(pos); 
     Dictionary<string, object[]> row = FromByteArray(v); 
     // Advance our position variable. 
     pos += row.Count; 
    } 
} 

最大的问题是reader.ReadBytes(XXX) - >应该是什么值看?我事先不知道。我需要读整行并转换为字典。我使用转换回来的方法是:

public static Dictionary<string, object[]> FromByteArray(byte[] data) 
{ 
    BinaryFormatter bf = new BinaryFormatter(); 
    using(MemoryStream ms = new MemoryStream(data)) 
    { 
     object obj = bf.Deserialize(ms); 
     return (Dictionary<string, object[]>)obj; 
    } 
} 

正如我所说FromByteArray工作正常的第一线,我没有发现任何方式来阅读下一行。

当我使用BinarryFormatter序列化完整文件时,如果文件不是那么大,它会通过。如果是OOM发生。同样代表反序列化。这就是为什么我希望它部分序列化/反序列化。

尝试了一切,到处搜索。感谢帮助这一个。

+2

什么是你的二进制文件中的“行”的定义是什么?在文本文件中,行由回车符和换行符分隔。也许当你把数据写入文件时,你应该写出每个“行”的长度,后面跟着它的数据。然后,当你在文件中读取,你会读一个整数,然后通过读取该整数每行指定的字节数。 –

回答

3

对于每次迭代保存在文件中的还有以下序列化对象的长度。

读取数据时,每次迭代先读4个字节(reader.ReadInt32)来获得这个值,读这么多字节反序列化。

我想应该是这样的:

using(var fileStream = new FileStream(@"D:\temp.bin", FileMode.Create, FileAccess.Write, FileShare.None)) 
{ 
    using(var bw = new BinaryWriter(fileStream)) 
    { 
     foreach(Dictionary<string, object[]> row in rows) 
     { 
      byte[] bytes = ObjectToByteArray(row); 
      bw.Write(bytes.Length); 
      bw.Write(bytes); 
     } 
    } 
} 


using(BinaryReader reader = new BinaryReader(File.Open(@"D:\temp.bin", FileMode.Open))) 
{ 
    int length = (int)reader.BaseStream.Length; 
    while(reader.BaseStream.Position != length) 
    { 
     int bytesToRead = reader.ReadInt32(); 
     byte[] v = reader.ReadBytes(bytesToRead); 
     Dictionary<string, object[]> row = FromByteArray(v); 
    } 
}     
+0

谢谢! :)老兄我拥有你一杯啤酒:) –