gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:35:15 24 4
gpt4 key购买 nike

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

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

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

谢谢。

最佳答案

好吧,将数据保存到流中就是序列化;真正的诀窍是:什么样的。例如,我假设您正在谈论诸如 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com