无法读取流的结尾

时间:2016-02-18 22:54:11

标签: c# serialization unity3d memorystream binaryformatter

所以我试图在Unity 5.3中使用UDP通过网络发送一些数据。因为包可能太大而无法立即发送,我试图将它们拆分成较小的包。 (注意:这些包​​每秒发送30次,因此丢失某个包确实无关紧要)

我基本上做的是:

  1. 创建字节数组
  2. 拆分为不同的较小的字节数组
  3. 使用其他信息将字节数组添加到序列化类
  4. 将序列化类转换为字节数组
  5. 发送,反之亦然接收客户端
  6. 我收到错误"无法读取流的结尾"当我尝试反序列化接收的字节数组时。

    这是反序列化的代码:

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

1 个答案:

答案 0 :(得分:0)

发现它......

它与上面的代码无关,而是与接收客户端的缓冲区有关。我将缓冲区设置为1024字节,而发送的包大小超过了这个大小。

所以,2个解决方法是:

  1. 增加缓冲区大小
  2. 读取缓冲区,存储数据,清除缓冲区,读取数据,添加数据等。(未经测试,只是假设)
  3. 随时向我们提供更多知识!