从字节数组反序列化时如何确定字符串的长度?

时间:2019-08-14 06:29:58

标签: c# serialization deserialization msgpack

我使用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;
    }
}

2 个答案:

答案 0 :(得分:2)

如今,20MB的容量已经不那么多了,甚至在手机上也是如此。只需将整个数组读入内存并对其进行解码即可。

答案 1 :(得分:0)

解决方案很简单:

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

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

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