我正在使用以下代码从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发生。同样代表反序列化。这就是为什么我希望它部分序列化/反序列化。
尝试了一切,到处搜索。感谢帮助这一个。
什么是你的二进制文件中的“行”的定义是什么?在文本文件中,行由回车符和换行符分隔。也许当你把数据写入文件时,你应该写出每个“行”的长度,后面跟着它的数据。然后,当你在文件中读取,你会读一个整数,然后通过读取该整数每行指定的字节数。 –