Итак, я пытаюсь отправить некоторые данные по сети, используя UDP в Unity 5.3. Поскольку пакеты могут быть слишком большими для отправки сразу, я попытался разбить их на более мелкие. (Примечание: Эти пакеты получают отправить в 30 раз в секунду, поэтому потеря определенного пакета действительно не имеет значения)Не удалось прочитать прошлый конец потока
То, что я в основном сделал:
- Создание массива байт
- Split в разные , меньше, массивы байт
- Добавить массив байт в сериализованный класс с другой информацией
- Преобразования сериализованного класса в массив байт
- Send, и наоборот, на принимающем клиенте
При попытке десериализовать полученный массив байтов я получаю сообщение об ошибке «Не удалось прочитать прошлый конец потока».
Вот код Deserialize:
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;}
}
Любая идея, что может привести к этому исключению?
Вы могли бы сэкономить мне парик, поняв это. Так что спасибо заранее!
EDIT:
Предоставленные функции, которые обрабатывают сериализации:
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();
}
Если 'data' из' ToObject' были точно такими же отправленными байтами, вы не получили бы эту ошибку. Но трудно догадаться об ошибке с кодом, который вы указали ... – Eser
Я получаю это, но он держит меня за исключение для каждого полученного пакета. Я обновляю вопрос с помощью кода, где я собираю сериализованный класс –