Не удалось прочитать после конца потока

Итак, я пытаюсь отправить некоторые данные по сети, используя UDP в Unity 5.3. Поскольку пакеты могут быть слишком большими, чтобы их можно было отправить сразу, я попытался разбить их на более мелкие. (примечание: эти пакеты отправляются 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();
}

person Nick Peelman    schedule 18.02.2016    source источник
comment
если бы data из ToObject были точно такими же, как отправленные байты, вы не получили бы эту ошибку. Но трудно угадать ошибку с кодом, который вы предоставили...   -  person Eser    schedule 19.02.2016
comment
Я понимаю это, но он продолжает выдавать мне исключение для каждого полученного пакета. Я обновляю вопрос кодом, в котором я собираю сериализованный класс   -  person Nick Peelman    schedule 19.02.2016


Ответы (1)


Нашел...

Это не имело ничего общего с приведенным выше кодом, а было связано с буфером принимающего клиента. Я установил буфер на 1024 байта, в то время как отправляемые пакеты превышали этот размер.

Итак, 2 обходных пути:

  1. Увеличьте размер буфера
  2. Чтение буфера, сохранение данных, очистка буфера, чтение данных, добавление данных и т. д. (Не тестировалось, просто предполагается)

Не стесняйтесь сообщить нам больше знаний!

person Nick Peelman    schedule 20.02.2016