繁体   English   中英

从 Stream C# 读取所有字节

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM