gpt4 book ai didi

c# - 无法读取超过流的末尾

转载 作者:行者123 更新时间:2023-11-30 18:21:25 29 4
gpt4 key购买 nike

所以我尝试在 Unity 5.3 中使用 UDP 通过网络发送一些数据。因为包裹可能太大,一次寄不出去,所以我试着把它们分成几个小包裹。 (注意:这些包​​每秒发送 30 次,因此丢失某个包真的无关紧要)

我基本上做的是:

  1. 创建字节数组
  2. 拆分成不同的、更小的字节数组
  3. 将字节数组与其他信息一起添加到序列化类
  4. 将序列化类转换为字节数组
  5. 在接收端发送,反之亦然

当我尝试反序列化接收到的字节数组时,收到错误“无法读取流结束”。

反序列化代码如下:

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();
}

最佳答案

找到了...

和上面的代码没有关系,和接收端的buffer有关。我将缓冲区设置为 1024 字节,而发送的包超过了该大小。

因此,有 2 个解决方法:

  1. 增加缓冲区大小
  2. 读取缓冲区、存储数据、清除缓冲区、读取数据、添加数据等。(未测试,只是假设)

随时向我们更新更多知识!

关于c# - 无法读取超过流的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35494122/

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