c# - 在不使用序列化的情况下将字符串数组持久化到流中的可能方法?

标签 c# .net

在不使用序列化的情况下,有哪些可能的方法可以将字符串数组保存到流中?

我对字符串特别感兴趣,因为它们的长度可能会有所不同。我也应该能够从流中恢复数组。 而且,更重要的是,我希望能够只读取数组的一部分而不将整个数组读入内存,因为我的数组可能会很大。

附言我知道存在数据库,我不应该重新发明轮子等,但我有理由选择手工制作的解决方案。

谢谢。

最佳答案

好吧,将数据保存到流中就是序列化;真正的诀窍是:什么样的。例如,我假设您正在谈论诸如 XmlSerializerBinaryFormatter 之类的东西,它们需要您反序列化整个东西,但这并不总是必要的。

通过为每个字符串写一个长度前缀,您应该能够很容易地找到您不想要的过去项目。另一种选择是(单独)编写偏移量索引,但这有时有点矫枉过正。

作为基本示例,s“jkl”没有它读取整个流或反序列化不需要的字符串;请注意,它可以通过(例如)对 int(长度)使用可变长度编码来优化,这也将修复当前假设,即读者和作者之间的字节顺序相同:

static void Main()
{
    byte[] raw;
    using (MemoryStream ms = new MemoryStream())
    {
        // serialize all
        List<string> data = new List<string> {
           "abc", "def", "ghi", "jkl", "mno", "pqr" };
        foreach (string s in data)
        {
            byte[] buffer = Encoding.UTF8.GetBytes(s);
            byte[] lenBuffer = BitConverter.GetBytes(buffer.Length);
            ms.Write(lenBuffer, 0, lenBuffer.Length);
            ms.Write(buffer, 0, buffer.Length);
        }
        raw = ms.ToArray();
    }
    using (MemoryStream ms = new MemoryStream(raw))
    {
        int offset = 3, len;
        byte[] buffer = new byte[128];
        while (offset-- > 0)
        {
            Read(ms, ref buffer, 4);
            len = BitConverter.ToInt32(buffer, 0);
            ms.Seek(len, SeekOrigin.Current); // assume seekable, but
                                              // easy to read past if not
        }
        Read(ms, ref buffer, 4);
        len = BitConverter.ToInt32(buffer, 0);
        Read(ms, ref buffer, len);
        string s = Encoding.UTF8.GetString(buffer, 0, len);
    }
}
static void Read(Stream stream, ref byte[] buffer, int count)
{
    if (buffer.Length < count) buffer = new byte[count];
    int offset = 0;
    while (count > 0)
    {
        int bytes = stream.Read(buffer, offset, count);
        if (bytes <= 0) throw new EndOfStreamException();
        offset += bytes;
        count -= bytes;
    }
}

关于c# - 在不使用序列化的情况下将字符串数组持久化到流中的可能方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1990943/

相关文章:

c# - 从遗留类(启动方法 + 事件)创建任务(或可观察对象)

c# - 根据几个系列的 X 值部分中的值缩放图表的 Y Axis

.net - Windows 窗体设计器自定义控件更改在运行时正常工作但在设计时不能正常工作的 anchor

c# - Entity Framework Core 中的批量更新

c# - 为什么不能在 .NET 中定义通用索引器?

c# - 从 Visual Studio SQL 项目创建用于测试的 LocalDB

c# - 如何从文本文件中删除逗号的最后一个索引?

c# - .NET 程序集名称包含点

c# - 如何将图表标题设置在y轴上方?

c# - 你如何确保你的熵值