[英]Read All Bytes From Stream C#
I'm trying to make a function which takes a Stream
(any type of stream, NetworkStream
, FileStream
, etc...) and write a byte array then reads the array, for this case I'm using BinaryWriter
and BinaryReader
. 写作部分工作正常,我只是BinaryWriter.Write
function。 但读者部分似乎提出了一个问题,尤其是当我使用NetworkStream
时。 我找不到从 stream 读取所有字节的方法。 所以我想知道是否甚至可以从NetworkStream
读取所有字节,同时将其视为 Stream 类型的Stream
。 我可以将它转换为套接字,然后使用套接字函数,但我想知道是否有一种方法可以编写可以同时使用NetworkStream
和其他类型的流的代码。 这是两个功能:问题在第一种情况下,在Deserialize
方法中
public static void Serialize(Stream stream, object obj)
{
BinaryWriter writer = new BinaryWriter(stream);
switch (Compression)
{
case FormatCompression.Binary:
writer.Write(BinaryDeconstructor.Deconstruct(obj));
break;
case FormatCompression.String:
writer.Write(Deconstructor.Deconstruct(obj));
break;
default:
throw new SerializationException("Please choose a format compression");
}
writer.Flush();
}
public static object Deserialize(Stream stream)
{
BinaryReader reader = new BinaryReader(stream);
switch (Compression)
{
case FormatCompression.Binary:
byte[] packet = /*HOW?!*/;
object obj = BinaryConstructor.Construct(packet);
return obj;
case FormatCompression.String:
//this case works fine
string objGraphData = reader.ReadString();
return Constructor.Construct(objGraphData);
default:
throw new SerializationException("Please choose a format compression");
}
}
网络 stream 的问题是你不知道什么时候停止读取并开始反序列化。 不过,这很容易解决:如果您在序列化数组之前传递要读取的字节数,则读取器可以先读取该数字,因为该数字占用固定数量的字节,然后使用该数字读取实际字节的数组。
计算字节数有点棘手。 它可以通过序列化到临时 memory 缓冲区来解决,获取缓冲区大小,发送大小,最后发送实际的字节数组,您现在在 memory 中拥有:
// Writing
var writer = new BinaryWriter(stream);
switch (Compression) {
case FormatCompression.Binary:
var memStream = new MemorySteam();
var memWriter = new BinaryWriter(memStream);
memWriter.Write(BinaryDeconstructor.Deconstruct(obj));
memWriter.Flush();
writer.Write(memStream.Length);
writer.Write(memStream.GetBuffer());
break;
case FormatCompression.String:
writer.Write(Deconstructor.Deconstruct(obj));
break;
default:
throw new SerializationException("Please choose a format compression");
}
writer.Flush();
现在,您的二进制反序列化代码可以访问一个int
,该参数表示您传递给从任何类型的 stream 读取指定字节数的方法的参数。 请注意,如果您想在生产环境中使用此代码,则必须验证从线路中出来的长度,以避免攻击者通过此协议将太大或负数传递给您的程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.