Question and API proposal regarding DotNext.IO #182
Replies: 1 comment 2 replies
It is not mandatory to have settable members on types implementing These optimizations are possible only of the object contents is in contiguous memory (while
This reduces a surface for potential reuse. For instance, stackalloc'ed memory cannot be represented as |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Hello, first of all I would first like to express my sincere appreciation for this amazing library !
Question
For the sake of my personal understanding, I am curious about the motivations behind your choice to design a non-generic SequenceReader, rather than enhancing the existing System.Buffers.SequenceReader (aside from the async method overloads).
API proposal
Furthermore, I would like to make a proposal for new APIs and changes to existing ones for pipe-related scenarios which could be beneficial for users willing to directly read from a sequence that was obtained from a
PipeReadervia aSequenceReader<byte>.I have largely completed the necessary work and testing within a private repository of my own, achieving close to 90% coverage. If required, I can ensure this coverage reaches 100%. It would be my pleasure to introduce these modifications to DotNext via a pull request.
Background and motivation
The
IBinaryFormattable<TSelf>, from my perspective, is somewhat lacking in terms of extensibility. It could be beneficial to divide it into separate read-only and write-only interfaces. Additionally, new interfaces could be introduced for binary readable types that expose settable members, which would not necessarily require the implementation of a static abstract interface method.In relation to pipe-related scenarios, users might desire to implement an
IBinaryFormattable<TSelf>, and as such, may not be inclined to implement parsing logic based on aSpanReader<byte>to process input data from aReadOnlySequence<byte>. Instead, they could directly depend on aSequenceReader<byte>, which would eliminate the need to copy the input data into a single stack-allocated or rented span.I believe that implementing these modifications would pave the way for APIs that are prepared for source-generator integration which is a feature I intend to develop in the future.
Proposal
Consequently, my proposal could take several directions depending on the scenarios we aim to address:
If we primarily want to address pipe-related scenarios:
IBinaryFormattable<TSelf>into three interfaces:IBinaryWritablewith a publicvoid Serialize(ref SpanWriter<T> output)and potentially an instanceint GetSizeOf()method, or another interface enabling the addition of extension methods to write into anIBufferWriter<byte>or various memory owners.IBinaryReadablewith a publicvoid Deserialize(ref SpanReader<T> input)for objects with settable members.IBinaryReadable<TSelf>with a static abstractReadmethod for objects with init-only members.IBinaryFormattable : IBinaryWritable, IBinaryReadablefor objects exposing setting members.IBinaryFormattable<TSelf>toIBinaryFormattable<TSelf> : IBinaryReadable<TSelf>, IBinaryWritable.IBufferReadableandIBufferReadable<TSelf>that mirror theIBinaryReadableinterfaces but use aSequenceReader<byte>instead.IBinaryFormattable-like interfaces for the sequence-basedIBufferReadableinterfaces.If we aim to cover a broader range of scenarios (e.g., spans of chars):
ISpanReadable<T>,ISpanReadable<TSelf, T>andISpanWritable<T>interfaces, where T represents the span element type.Source code
I have made some of the suggested APIs available in a gist, which can be found here: https://gist.github.com/thenameless314159/a2a6487ce19c0da24d08a1cf328ddc8e
All reactions