Stream.WriteTo блокирует поток - PullRequest
       0

Stream.WriteTo блокирует поток

1 голос
/ 01 сентября 2011

У меня есть этот код:

public static void SerializeRO(Stream stream, ReplicableObject ro) {
    MemoryStream serializedObjectStream = new MemoryStream();
    Formatter.Serialize(serializedObjectStream, ro);

    MemoryStream writeStream = new MemoryStream();
    BinaryWriter bw = new BinaryWriter(writeStream);

    bw.Write(serializedObjectStream.Length);
    serializedObjectStream.Seek(0, SeekOrigin.Begin);
    serializedObjectStream.WriteTo(writeStream);
    serializedObjectStream.Close();

    writeStream.WriteTo(stream);

    bw.Close();
}

Строка writeStream.WriteTo(stream); никогда не заканчивается. Программа попадает в эту строку и не будет прогрессировать.

stream - это всегда NetworkStream. Я проверил и думаю, что это действительный объект (по крайней мере, он не null и не уничтожен).

Так что же происходит?

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Я попробовал ваш код - запись в FileStream - и я всегда получаю ноль байтов, записанных в поток. Я не знаю, почему WriteTo блокируется на NextWorkStream, когда нечего писать, но это может быть проблемой

Когда я извлекаю байты из MemoryStream и записываю их непосредственно в поток, все работает, например. (Я создаю двоичный форматер в подпрограмме, кажется, у вас уже есть форматер).

public static void SerializeRO(Stream stream, object ro)
{
    MemoryStream serializedObjectStream = new MemoryStream();
    var f = new BinaryFormatter();
    f.Serialize(serializedObjectStream, ro);

    MemoryStream writeStream = new MemoryStream();
    BinaryWriter bw = new BinaryWriter(writeStream);

    var bytes = serializedObjectStream.ToArray();
    bw.Write(bytes.Length);
    bw.Write(bytes);

    var bwBytes = writeStream.ToArray();

    stream.Write(bwBytes, 0, bwBytes.Length);

    bw.Close();
}

Однако я бы сделал это так с одним MemoryStream и записал бы прямо в stream, если только я не знаю что-то о NetworkStream (это, конечно, закроет stream, что, возможно, не то, что хочешь)

public static void SerializeRO(Stream stream, object ro)
{
    byte[] allBytes;
    using (var serializedObjectStream = new MemoryStream())
    {
        var f = new BinaryFormatter();
        f.Serialize(serializedObjectStream, ro);
        allBytes = serializedObjectStream.ToArray();
    }
    using (var bw = new BinaryWriter(stream))
    {
        bw.Write(allBytes.Length);
        bw.Write(allBytes);
    }
}

Версия, которая не закроет ваш NetworkStream (только не помещайте двоичный модуль записи в оператор using или Close() it)

public static void SerializeRO(Stream stream, object ro)
{
    byte[] allBytes;
    using (var serializedObjectStream = new MemoryStream())
    {
        var f = new BinaryFormatter();
        f.Serialize(serializedObjectStream, ro);
        allBytes = serializedObjectStream.ToArray();
    }
    var bw = new BinaryWriter(stream)
    bw.Write(allBytes.Length);
    bw.Write(allBytes);
}
1 голос
/ 01 сентября 2011

Только мои мысли: попробуйте закрыть свой BinaryWriter перед записью потока в другой. Пока ваш писатель открыт, поток не закончен, и в результате WriteTo newer найдет конец потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...