无法读取流的末尾
本文关键字:读取 | 更新日期: 2023-09-27 18:35:14
所以我正在尝试使用 Unity 5.3 中的 UDP 通过网络发送一些数据。由于包裹可能太大而无法立即发送,因此我尝试将它们分成较小的包裹。(注意:这些包裹以每秒 30 次的速度发送,因此丢失某个包裹真的无关紧要)
我基本上做的是:
- 创建字节数组
- 拆分为不同的较小字节数组
- 将字节数组添加到包含其他信息的序列化类
- 将序列化类转换为字节数组
- 在接收客户端上发送,反之亦然
当我尝试反序列化收到的字节数组时,我收到错误"无法读取流的末尾"。
下面是反序列化的代码:
private static object ToObject(byte[] data)
{
var formatter = new BinaryFormatter();
using (var stream = new MemoryStream(data))
{
stream.Seek(0, SeekOrigin.Begin);
return formatter.Deserialize(stream); // exception thrown here
}
}
序列化:
private static byte[] ToByteArray(object source)
{
var formatter = new BinaryFormatter();
using (var stream = new MemoryStream())
{
formatter.Serialize(stream, source);
return stream.ToArray();
}
}
类:
[System.Serializable]
public class Chunk
{
public short ID {get; set;}
public short ChunkAmount {get; set;}
public System.Int64 FrameID {get; set;}
public byte[] ChunkData {get; set;}
}
知道什么会导致这种异常吗?
你可以通过弄清楚这一点来为我节省一顶假发。所以提前感谢!
编辑:
提供了处理序列化的函数:
public static List<byte[]> GetChunks(List<byte> bytes, int maxChunkSize, System.Int64 frameID)
{
var list = new List<byte[]>();
for (int i=0; i < bytes.Count; i+= maxChunkSize)
{
list.Add(bytes.GetRange(i, Mathf.Min(maxChunkSize, bytes.Count - i)).ToArray());
}
List<byte[]> serializedChunks = new List<byte[]>();
for(int i = 0; i < list.Count; i++)
{
Chunk c = new Chunk();
c.ID = (short)i;
c.ChunkData = list[i].ToArray();
c.ChunkAmount = (short)list.Count;
c.FrameID = frameID;
serializedChunks.Add(ToByteArray(c));
}
return serializedChunks;
}
//Deserialized a chunk from byte array
public static Chunk AssembleSingleChunk(byte[] serializedChunk)
{
return (Chunk)ToObject(serializedChunk);
}
public static byte[] AssembleChunks(List<Chunk> chunks)
{
List<Chunk> chunkList = new List<Chunk>(chunks);
List<Chunk> sortedChunkList = chunkList.OrderBy(c => c.ID).ToList();
List<byte> allBytes = new List<byte>();
for (int i = 0; i < sortedChunkList.Count; i++)
{
allBytes.AddRange(sortedChunkList[i].ChunkData);
}
return allBytes.ToArray();
}
找到了...
它与上面的代码没有任何关系,但与接收客户端的缓冲区有关。我将缓冲区设置为 1024 字节,而发送的包超过该大小。
因此,2 种解决方法是:
- 增加缓冲区大小 读取缓冲区、存储数据、
- 清除缓冲区、读取数据、添加数据等。(未测试,只是假设)
随时为我们更新更多知识!