流式序列化按需数据

Streaming serialized on demand data

提问人:arwyl 提问时间:11/9/2023 更新时间:11/9/2023 访问量:33

问:

我有一个第三方客户端,它接受一个 Stream 并将其作为 StreamContent 发送到某个服务器。 我需要在那里发送大量数据。 当前的做法是将所有数据序列化到 MemoryStream 并将其传递给第三方客户端。

据我了解,当需要将数据写入套接字时,会创建一个缓冲区,并将数据从流读取到该缓冲区,然后写入套接字(重复冲洗)。

我想尝试另一种方法:编写一个自定义流实现,当调用 Read 方法时,它将包含所有数据以按需逐个发送和序列化数据项。

我不能停止思考,有人已经为此制作了一个自定义的 Stream 实现,但我找不到它。

为了演示该方法,一些伪代码:

public class MyStream : Stream
{
    private readonly IEnumerable<object> _data;

    private readonly byte[] _buffer = new byte[1024]; // somehow calculated max size for a data record

    public override bool CanRead => true;

    public override bool CanSeek => false;

    public override bool CanWrite => false;

    public override long Length => -1;

    public override long Position { get => throw new InvalidOperationException(); set => throw new InvalidOperationException(); }

    public MyStream(IEnumerable<object> data)
    {
        _data = data ?? throw new ArgumentNullException(nameof(data));
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        // serialize next one entity to _buffer
        // copy from _buffer to buffer
        // if buffer not full, repeat

        return ...;
    }

    public override void Flush()
    {
        throw new InvalidOperationException();
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        throw new InvalidOperationException();
    }

    public override void SetLength(long value)
    {
        throw new InvalidOperationException();
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        throw new InvalidOperationException();
    }
}

您能否分享您对这种方法的看法,如果可能的话,还能分享有用的 nuget 包吗?

C# .net-core 序列化

评论


答: 暂无答案