我使用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;
}
}
答案 0 :(得分:2)
如今,20MB的容量已经不那么多了,甚至在手机上也是如此。只需将整个数组读入内存并对其进行解码即可。
答案 1 :(得分:0)
解决方案很简单:
我需要先写字符串长度(在序列化器上)。
off += MessagePackBinary.WriteInt32(inputStream, str.Length);
当我反序列化时,从流中读取长度,然后对缓冲区长度和字符串长度进行设计。