Я использую пользовательскую реализацию Stream
, которая будет транслировать IEnumerable<T>
в поток. Я использую эту реализацию EnumerableStream для выполнения преобразования.
Я использую его для выполнения потоковой передачи через WCF в потоковом режиме. Я могу конвертировать IEnumerable
в поток без проблем. Однажды я на стороне клиента, я могу десериализовать и получить все данные, однако я не могу найти условие, чтобы прекратить зацикливание моего потока. Я получаю:
System.Runtime.Serialization.SerializationException: конец потока, обнаруженный до завершения анализа.
Вот пример того, чего я пытаюсь достичь:
class Program
{
public static void Main()
{
var ListToSend = new List<List<string>>();
var ListToReceive = new List<List<string>>();
ListToSend = SimulateData().ToList();
using (Stream stream = GetStream(ListToSend))
{
var formatter = new BinaryFormatter();
while (stream.CanRead || 1 == 1 || true...) // What should I put in here to stop once I read everything???
{
List<string> row = formatter.Deserialize(stream) as List<string>;
ListToReceive.Add(row);
}
Printer(ListToReceive);
Console.WriteLine("Done");
}
}
private static void Printer(List<List<string>> data)
{
Console.WriteLine("Printing");
foreach (var row in data)
{
foreach (var cell in row)
{
Console.Write(cell + "\t");
}
Console.WriteLine("-------------------------------------------------------------------------------");
}
}
private static Stream GetStream(IEnumerable<List<string>> data)
{
return EnumerableStream.Create(data, DeserializerCallback);
}
private static List<byte> DeserializerCallback(object obj)
{
var binFormatter = new BinaryFormatter();
var mStream = new MemoryStream();
binFormatter.Serialize(mStream, obj);
return mStream.ToArray().ToList();
}
private static IEnumerable<List<string>> SimulateData()
{
Random randomizer = new Random();
for (var i = 0; i < 10; i++)
{
var row = new List<string>();
for (var j = 0; j < 1000; j++)
{
row.Add((randomizer.Next(100)).ToString());
}
yield return row;
}
}
}
Я не включил пользовательский поток. Я создал скрипку для тех, кто хочет увидеть весь код.
- Нужно ли что-то добавлять в сам пользовательский поток, чтобы уведомить, что все данные прочитаны?
- Это потому, что формат десериализатора и сериализатора не совпадают (я так не думаю).
- Я также хочу знать, почему, когда я помещаю точку останова в функцию чтения, размер буфера изменяется случайным образом.
- Я бы предпочел не оборачивать код пробой и поймать, я хочу чистое решение, которое не вылетает.