日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据写入规则IBufferWriterT

發(fā)布時間:2023/12/4 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据写入规则IBufferWriterT 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??????? IBufferWriter<T>從名字上看大概已經猜到作用,這個接口是在.NET Standard 2.1作為標準支持。那這個接口的實際使用場和作用是什么?在了解之前先看一下System.Text.Json的一些代碼:

public?sealed?class?Utf8JsonWriter?:?IAsyncDisposable,?IDisposable {public?Utf8JsonWriter(IBufferWriter<byte>?bufferWriter,?JsonWriterOptions?options?=?default);??public?Utf8JsonWriter(Stream?utf8Json,?JsonWriterOptions?options?=?default); }

以下是.net core針對json序列化的數據寫入對象,有兩個造函數分別是Stream和IBufferWriter<byte>。Stream相信不用介紹了,它是基礎數據流讀寫規(guī)范,基本它派生出來的有FileStream,MemoryStream,NetworkStream等等,通過這個讀寫規(guī)范的抽象可以在讀寫數據的時候完全不用關心實際的數據源。那為什么要現在要引入IBufferWriter<byte>,它的好處是在那里?

IBufferWriter<byte>

????????在了解它之前需要知道它具體的作用是什么,以下是接口的定義

public?interface?IBufferWriter<T> {void Advance(int count);Memory<T>?GetMemory(int?sizeHint?=?0);Span<T> GetSpan(int sizeHint = 0);}

IBufferWriter的行為接口規(guī)范很簡單,兩個分配內存空間的方法,和一個確定寫入數據數量的方法。簡單來說使用不管內存分配的,需要的時候從相關方法獲取內存空間,當內存空間操作完成后通過Advance方法告訴給提供。

Stream

????????在對比差別之前先看一下Stream的寫入方法是怎樣的

public?abstract?void?Write(byte[]?buffer,?int?offset,?int?count); public?virtual?void?Write(ReadOnlySpan<byte>?buffer); public?Task?WriteAsync(byte[]?buffer,?int?offset,?int?count); public?virtual?ValueTask?WriteAsync(ReadOnlyMemory<byte>?buffer,?CancellationToken?cancellationToken?=?default); public virtual void WriteByte(byte value);

以上是Stream寫入數據的規(guī)范,它提供了一系列針對Bytes的寫入操作。

兩者的差別

????????通過兩者的提供的方法,否能了解Streram和IBufferWriter的差別?其實兩者的功能都是數據寫入,Stream規(guī)范了數據寫入方式,但無法給外部分配內存;而IBufferWriter則規(guī)范了對外的分配內存,但并沒有規(guī)范數據寫入方式。

????????顯然Stream在寫入上更規(guī)范,但為什么還要定義IBufferWriter?其實一切都是為了性能!由于Stream給外部申請內存空間,就意味著所有的寫入行為都是對參數buffer一個拷貝;而IBufferWriter則有所不同,它只管理空間分配和最終提交數量,在寫的過程中并不管控處理,使用者在獲取分配的空間后即可直接操作。

使用

? ? ? ? 既然這個規(guī)范是為了提高性能,而dotnet core的組件又開始支持,所以Beetlex在計劃的版本中也相應支持

public void Write(PipeStream stream, HttpResponse response){var buffer = stream.CreateBufferWriter();var writer = new Utf8JsonWriter(buffer, new JsonWriterOptions { SkipValidation = true });writer.Reset(buffer);JsonSerializer.Serialize(writer, Data);}

以上是System.Text.Json使用BeetleX PipeStream基于IBufferWrite的擴展,其實原理是JsonSerializer從IBufferWriter中獲取一小塊內存,寫滿后提交然后再次申請寫入,直到整個對象的序列化完成。

總結

以上是生活随笔為你收集整理的数据写入规则IBufferWriterT的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。