Stream.WriteTo锁定了线程
我有这样的代码: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
也没有处理)。
那么这是怎么回事?
我试过你的代码 - 写入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()
吧)
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);
}
对不起刚刚看到 - 并修复了 - 我的答案中的第一个版本中的一些破坏代码。 –
只是我的想法:试图关闭你的BinaryWriter
之前写入流到另一个。虽然你的作家是开放的流没有完成,结果WriteTo
新会发现流的结束。
关闭二进制写入程序会关闭writeStream,的确......但是,我无法从writeStream中获取数据(因为它已关闭)。那么我该怎么做? – Xenoprimate
为什么你不能只做Formatter.Serialize(stream,ro)?为什么你需要2个MemoryStreams? –
你还需要将你的流放入'using'块中。 –