首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用BinaryReader逐行读取

使用BinaryReader逐行读取
EN

Stack Overflow用户
提问于 2017-03-08 04:32:15
回答 1查看 5.6K关注 0票数 4

我使用以下代码来序列化来自dataTable的数据。

代码语言:javascript
复制
var rows = new List<Dictionary<string, object[]>>();

我填充DataTable中的行,并将它们放入字典中。不要问为什么:)

代码语言:javascript
复制
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);
    }
}

使用以下方法:

代码语言:javascript
复制
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可以实现的话。问题是我只能读第一行。

我想要实现的是:

代码语言:javascript
复制
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) ->应该读取什么值?我事先不知道这个。我需要阅读整行,并转换为字典。我用来转换回的方法是:

代码语言:javascript
复制
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。反序列化也是如此。这就是我希望它部分序列化/反序列化的原因。

什么都试过了到处都找过了。谢谢你帮我解决这个问题。

EN

回答 1

Stack Overflow用户

发布于 2017-03-08 04:43:17

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

在读取时,每次迭代首先读取4字节(reader.ReadInt32)以获取此值,然后读取此字节数进行反序列化。

我认为它应该是这样的:

代码语言:javascript
复制
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);
    }
}                
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42657779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档