2011-09-01 81 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