【问题标题】:How to determine length of the string while deserializing it from byte array?如何在从字节数组反序列化时确定字符串的长度?
【发布时间】:2019-08-14 06:29:58
【问题描述】:

我使用MessagePackSerializer 并尝试反序列化字节数组。 但数组可能非常大(10-20 MB)。

我正在将数据读入一个 1000 字节的中间缓冲区。 我从他们那里读取数据。

但是有一个问题:当我尝试读取一行太长时,可能会出现错误

System.ArgumentOutOfRangeException: Index and count must refer 
to a location within the buffer.

我需要找出我要读取的行超出了数组的边界,我需要将缓冲区扩展为行的大小。

我该怎么做?

我使用这个代码:

var stringValue = MessagePackBinary.ReadString(bytes, off, out readSize);

简单示例:

public class Example
{


    public void Serialize(Stream inputStream,string value)
    {
        MessagePackBinary.WriteString(inputStream, value);
    }

    public string Deserealize(Stream stream)
    {
        var off = 0;
        byte[] bytes = new byte[1000];
        int readSize = 0;

        stream.Read(bytes, off, bytes.Length);
        var stringValue = MessagePackBinary.ReadString(bytes, off, out readSize); //string can be very long
        return stringValue;
    }
}

【问题讨论】:

  • 如果你想用更小的缓冲区来做,你需要使用循环。看看this answer
  • @Joelies,没有。我找到了解决方案:我需要在序列化程序中写入字符串长度

标签: c# serialization deserialization msgpack


【解决方案1】:

如今,20MB 真的不算多,即使在手机上也是如此。只需将整个数组读入内存并解码即可。

【讨论】:

  • 它可以是 20MB 或 20 GB,我不知道确切的大小。这取决于用户机器上的数据大小
  • 如果真的可以很大,能不能用内存映射文件,让 Windows 自己操心分配物理内存?
【解决方案2】:

解决方法很简单:

我需要先写字符串的长度(在序列化器处)。

off += MessagePackBinary.WriteInt32(inputStream, str.Length);

当我从流中反序列化读取长度然后对缓冲区长度和字符串长度进行设计时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    相关资源
    最近更新 更多