数据写入规则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相信不用介绍了,它是基础数据流读写规范,基本它派生出来的有FileStream,MemoryStream,NetworkStream等等,通过这个读写规范的抽象可以在读写数据的时候完全不用关心实际的数据源。那为什么要现在要引入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的行为接口规范很简单,两个分配内存空间的方法,和一个确定写入数据数量的方法。简单来说使用不管内存分配的,需要的时候从相关方法获取内存空间,当内存空间操作完成后通过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写入数据的规范,它提供了一系列针对Bytes的写入操作。

两者的差别

        通过两者的提供的方法,否能了解Streram和IBufferWriter的差别?其实两者的功能都是数据写入,Stream规范了数据写入方式,但无法给外部分配内存;而IBufferWriter则规范了对外的分配内存,但并没有规范数据写入方式。

        显然Stream在写入上更规范,但为什么还要定义IBufferWriter?其实一切都是为了性能!由于Stream给外部申请内存空间,就意味着所有的写入行为都是对参数buffer一个拷贝;而IBufferWriter则有所不同,它只管理空间分配和最终提交数量,在写的过程中并不管控处理,使用者在获取分配的空间后即可直接操作。

使用

        既然这个规范是为了提高性能,而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中获取一小块内存,写满后提交然后再次申请写入,直到整个对象的序列化完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转]简单介绍如何用Reporting Service制作报表

1&#xff09; 在安装好Reporting Service后&#xff0c;打开Visual studio .net ,选择新建项目&#xff0c;选择建立商业智能项目&#xff0c;选择新建一个报表项目&#xff0c;命名为reportservice1,再选确定&#xff0c;如下图&#xff1a; 2&#xff09;之后&#xff0c;在…

freertos源码详解与应用开发 pdf_互联网企业面试必问Spring源码?搞定Spring源码,看完这篇就够了...

不用说&#xff0c;Spring已经成为Java后端开发的事实上的行业标准。无数公司选择Spring作为基本开发框架。大多数Java后端程序员在日常工作中也会接触到Spring。因此&#xff0c;如何很好地使用Spring&#xff0c;已成为Java程序员的必修课之一。同时&#xff0c;Spring Boot和…

adonis.js mysql_Adonis.js——数据库基本操作

一、配置数据库adonis支持 PostgreSQL&#xff0c;SQLite&#xff0c;MySQL&#xff0c;MariaDB&#xff0c;Oracle&#xff0c;MSSQL 数据库&#xff0c;默认为SQLite。在 config/database 中修改配置。connection: Env.get(DB_CONNECTION, mysql),二、创建数据库模型(Model)λ…

C# ObservableCollection和List的区别

一、ObservableCollection和List的区别1&#xff09;ObservableCollection比较简单&#xff0c;继承了Collection, INotifyCollectionChanged, INotifyPropertyChangedCollection&#xff1a;为泛型集合提供基类。INotifyCollectionChanged&#xff1a;将集合的动态更改通知给侦…

MS-SQLSERVER--错用了LEN()函数

sqlserver数据导入oracle时发现字符长度不对。。下面是两个函数的区别&#xff1a;DATALENGTH 返回任何表达式所占用的字节数。LEN 返回给定字符串表达式的字符&#xff08;而不是字节&#xff09;个数&#xff0c;其中不包含尾随空格转载于:https://www.cnblogs.com/yooplmqj/…

rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

原文托管在Github: https://github.com/shellhub/blog/issues/52数据结构与算法之线性表-顺序表实现(C语言版本)前言数据结构与算法是一个程序员必备的技能之一,而顺序表更是每个程序员在面试过程中要经常被问到的&#xff0c;如Java语言中的ArrayList类的底层实现就是使用顺序…

浅析 record 使用场景

浅析 record 使用场景Intro之前我们有介绍过 record 基本知识&#xff0c;可以参考 C# 9 新特性 — record 解读&#xff0c;record 会实现基于值的类型比较&#xff0c;最近遇到的几个问题觉得用 record 来解决会非常方便&#xff0c;分享一下基于值的类型比较最近有遇到一个场…

jax rs mysql_Jersey / JAX-RS ExceptionMapper MySQL

我正在学习Jersey / JAX-RS&#xff0c;我需要一些ExceptionMapper的帮助 .我有一个UserFacade类&#xff0c;AbstractFacade类和User类本身&#xff0c;都非常标准&#xff0c;主要是通过在Netbeans中创建一个带有Database的新Web Service RestFUL项目生成的 . 我的问题是&…

hadoop安装详细步骤_推荐一个超详细的Hadoop安装教程,已有32万次阅读

安装Hadoop软件系列&#xff0c;首选Linux系统&#xff0c;比如Ubuntu。如果你的系统是Windows&#xff0c;建议再安装一个Ubuntu&#xff0c;组成双系统&#xff0c;如此可以发挥各自系统的特点。使用U盘制作一个系统&#xff0c;拿出一块分区用作新装的系统&#xff0c;开机启…

后宫佳丽三千,假如古代皇帝也懂负载均衡算法...

古代皇帝&#xff0c;后宫佳丽三千&#xff0c;没法做到雨露均沾&#xff0c;但为了繁衍后代&#xff0c;子嗣繁盛&#xff0c;弱水三千&#xff0c;只取一瓢饮显然是不行的。不同的朝代有不同的宠幸妃子的方法&#xff0c;著名的有羊车望幸、掷筛侍寝、翻牌悬灯等等。如果皇帝…

常见DDoS技术方法和对应防御措施

DDOS***是现在最常见的一种******方式&#xff0c;下面就给大家简单介绍一下DDOS的七种***方式。 1.Synflood: 该***以多个随机的源主机地址向目的主机发送SYN包&#xff0c;而在收到目的主机的SYN ACK后并不回应&#xff0c;这样&#xff0c;目的主机就为这些源主机建立了大…

mac 配置php和mysql_Mac下配置PHP+MySql环境

由于最近需要布置mantis用来进行bug追踪&#xff0c;在此记录其过程。由于PHP apache环境在Mac OS上是自带的&#xff0c;所以不需要另处下安装包&#xff0c;只需要简单配置一下即可。首先打开终端输入命令&#xff1a;sudo vim /etc/apache2/httpd.conf其中有一行是这样的#Lo…

git使用的基本流程_git命令的基本使用

首先下载完git之后打开Git Bash配置你的邮箱和用户名&#xff08;github或gitee&#xff09;&#xff1a;$ git config --global user.name "注册时账号的名字"$ git config --global user.email "注册时使用的邮箱"获取ssh公钥&#xff1a;ssh-keygen -t …

软件性能测试与LoadRunner实战可以在网上和书店买到了

有很多朋友和学员对这本书已经期待很久了&#xff0c;今天可以幸福的告诉大家这本书&#xff0c;您可以在China-pub上订购了&#xff08;订购的链接&#xff1a;[url]http://www.china-pub.com/39876[/url]&#xff09;&#xff0c;也可以在书店买到喽。下面是专业人事的书评内…

Code Runner for VS Code 突破 2000 万下载量!支持超过 50 种语言

还记得五年前的夏天&#xff0c;我在巨硬写着世界上最好的语言&#xff0c;有时也需要带着游标卡尺写着另一门语言。然而&#xff0c;我对这两门语言都不熟悉&#xff0c;如果能在 VS Code 中方便快捷地运行各种语言&#xff0c;那岂不是很方便&#xff1f;于是&#xff0c;我就…

mysql group where_[MySQL] 测试where group by order by的索引问题

1. select * from test where axx group by b order by c 如何加索引CREATE TABLE index_test (id int(10) unsigned NOT NULL AUTO_INCREMENT,name varchar(100) NOT NULL DEFAULT ,gid int(11) NOT NULL DEFAULT 0,age int(11) NOT NULL DEFAULT 0,PRIMARY KEY (id)) ENGI…

gpl可以商用吗_一文看懂开源许可证,能不能商用再也不抓瞎

在github中闲逛&#xff0c;宝藏多福利好。不过心里或许总有小忐忑&#xff0c;这么多开源项目&#xff0c;我的产品里能不能用呀&#xff01;其实想知道项目能不能用看下项目的开源许可证就清楚了(即使是非软件产品比如数据、媒体、资料等也可以通过开源许可证知道它们的可用范…

使用 Tye 辅助开发 k8s 应用竟如此简单(一)

最近正巧在进行 Newbe.Claptrap 新版本的开发&#xff0c;其中使用到了 Tye 来辅助 k8s 应用的开发。该系列我们就来简单了解一下其用法。安装 Tye 首先&#xff0c;确保已经正确安装了 netcore 2.1 或以上版本的 dotnet SDK。Tye 目前还处于开发阶段&#xff0c;因此&#xff…

np变题了。但我过了

前天5月14号&#xff0c;一个平静的日子。我去参加了np的bsci考试&#xff0c;但不幸的是一进去看到考题就发晕了。题变了&#xff0c;后来才知道&#xff0c;我去考试的时间是变题的第二天。但万幸的是经过艰苦的努力&#xff0c;我终于看到了Congratulations&#xff0c;出来…

mysql修改主键生成策略信息_常用Hibernate 主键生成策略

1.AssignedAssigned方式由程序生成主键值&#xff0c;并且要在save()之前指定否则会抛出异常特点&#xff1a;主键的生成值完全由用户决定&#xff0c;与底层数据库无关。用户需要维护主键值&#xff0c;在调用session.save()之前要指定主键值。2.HiloHilo使用高低位算法生成主…