2011-09-01 49 views
1

我有這樣的代碼:Stream.WriteTo鎖定了線程

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也沒有處理)。

那麼這是怎麼回事?

+1

爲什麼你不能只做Formatter.Serialize(stream,ro)?爲什麼你需要2個MemoryStreams? –

+1

你還需要將你的流放入'using'塊中。 –

回答

1

我試過你的代碼 - 寫入FileStream - 我總是將零字節寫入流中。我不知道爲什麼會WriteToNextWorkStream阻止時,有沒什麼好寫的,但是當我從中提取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()吧)

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); 
} 
+0

對不起剛剛看到 - 並修復了 - 我的答案中的第一個版本中的一些破壞代碼。 –

1

只是我的想法:試圖關閉你的BinaryWriter之前寫入流到另一個。雖然你的作家是開放的流沒有完成,結果WriteTo新會發現流的結束。

+0

關閉二進制寫入程序會關閉writeStream,的確......但是,我無法從writeStream中獲取數據(因爲它已關閉)。那麼我該怎麼做? – Xenoprimate