news 2026/7/6 19:04:35

DotNetJS类型系统揭秘:从基础到高级的序列化技巧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DotNetJS类型系统揭秘:从基础到高级的序列化技巧

DotNetJS类型系统揭秘:从基础到高级的序列化技巧

【免费下载链接】DotNetJSUse C# in web apps with comfort项目地址: https://gitcode.com/gh_mirrors/do/DotNetJS

DotNetJS是一个让开发者能够在Web应用中舒适使用C#的强大工具,其核心在于提供了C#与JavaScript之间的无缝互操作能力。而类型系统的序列化机制正是实现这一能力的关键所在,它确保了不同类型的数据能够在两种语言之间高效、准确地传递。

在DotNetJS中,大部分简单类型在C#和JavaScript之间交互时会进行内存中的直接封送。例如数字、布尔值、字符串、数组(列表)以及它们的任务类型等。下面是一些原生支持的类型对应关系(完整列表可参考.NET文档):

C#JavaScriptTask ofArray of
boolboolean✔️
bytenumber✔️✔️
charstring✔️
stringstring✔️✔️
intnumber✔️✔️
longBigInt✔️
floatNumber✔️
DateTimeDate✔️

当互操作API中指定了非原生支持类型的值时,Bootsharp会使用自定义的高效二进制序列化格式对其进行序列化和反序列化。整个过程在C#和JavaScript两侧都封装在底层,开发者无需为每个值手动编写生成器提示或指定[MarshallAs]属性。

比如定义一个User记录:

public record User (long Id, string Name, DateTime Registered);

然后在导出的API中使用它:

[Export] public static void AddUser (User user) { } [Export] public static event Action<User>? OnUserModified;

Bootsharp会自动生成在两端对User记录进行序列化和反序列化所需的C#和JavaScript代码,使得开发者可以像使用原生JavaScript API一样使用这些C# API:

import { Program } from "bootsharp"; Program.addUser({ id: 17, name: "Carl", registered: Date.now() }); Program.onUserModified.subscribe(handleUserModified); function handleUserModified(user: Program.User) { }

需要注意的是,只有具有不可变语义的类型(结构、记录和只读集合)才会进行序列化,其他类型被视为可变类型,会作为互操作实例通过引用传递。

枚举序列化技巧

枚举为了获得更好的性能,会被封送为数字,同时在JavaScript端会额外生成名称与索引的映射,以方便使用。

定义一个枚举:

public enum Options { Foo, Bar }

导出使用枚举的方法:

[Export] public static Options GetOption () => Options.Bar;

虽然GetOptions的返回值会以整数索引的形式传递给JavaScript,但Bootsharp会在生成的代码中将枚举索引映射到字符串值(反之亦然),因此可以像下面这样正常使用:

import { Program } from "bootsharp"; const option = Program.getOption(); console.log(option === Program.Options.Foo); // false console.log(option === Program.Options.Bar); // true console.log(Program.Options[Program.Options.Foo]); // "Foo" console.log(Program.Options[1]); // "Bar"

字典序列化方法

Bootsharp会将C#字典封送为ES6的Map。例如:

[Export] public static Dictionary<string, bool> GetMap () => new () { ["foo"] = true, ["bar"] = false };

在JavaScript中,可以使用标准的MapAPI来访问这个字典:

import { Program } from "bootsharp"; const map = Program.getMap(); console.log(map.get("foo")); // true console.log(map.get("bar")); // false

集合接口处理方式

在编写C# API时,使用各种集合接口(如IReadOnlyListIReadOnlyDictionary)是很常见的。Bootsharp会接受互操作API中任何类型的数组或字典兼容接口,并默认将它们封送为普通数组和映射。

例如:

[Export] public static IReadOnlyDictionary<string, float> Map ( IReadOnlyList<string> a, IReadOnlyCollection<float> b) { }

在JavaScript中可以这样调用:

import { Program } from "bootsharp"; const map = Program.map(["foo", "bar"], [0, 7]); console.log(map.get("bar")); // 7

通过掌握这些DotNetJS类型系统的序列化技巧,开发者可以更加轻松地在Web应用中使用C#,实现C#与JavaScript之间的数据无缝传递,提升开发效率和应用性能。更多关于序列化的详细内容可以参考官方文档docs/guide/serialization.md。

【免费下载链接】DotNetJSUse C# in web apps with comfort项目地址: https://gitcode.com/gh_mirrors/do/DotNetJS

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 19:01:46

etcdadm与Kubernetes集成:构建高可用K8s集群的etcd配置

etcdadm与Kubernetes集成&#xff1a;构建高可用K8s集群的etcd配置 【免费下载链接】etcdadm 项目地址: https://gitcode.com/gh_mirrors/et/etcdadm etcdadm是一款专为etcd集群设计的命令行工具&#xff0c;它能轻松创建新集群、添加或移除成员&#xff0c;用户体验灵…

作者头像 李华
网站建设 2026/7/6 19:01:16

如何自定义EnergyBar Touch Bar:个性化设置完全教程

如何自定义EnergyBar Touch Bar&#xff1a;个性化设置完全教程 【免费下载链接】EnergyBar Supercharge your Macs Touch Bar. 项目地址: https://gitcode.com/gh_mirrors/en/EnergyBar 想要让你的Mac Touch Bar变得既实用又炫酷吗&#xff1f;EnergyBar就是你的终极解…

作者头像 李华
网站建设 2026/7/6 19:00:50

Pure.DI最佳实践:大型企业级应用架构设计的终极指南

Pure.DI最佳实践&#xff1a;大型企业级应用架构设计的终极指南 【免费下载链接】Pure.DI Pure DI for .NET 项目地址: https://gitcode.com/gh_mirrors/pu/Pure.DI Pure.DI作为.NET生态中革命性的编译时依赖注入框架&#xff0c;正在彻底改变企业级应用的架构设计方式。…

作者头像 李华
网站建设 2026/7/6 19:00:01

EnergyBar开发者指南:如何创建自己的Touch Bar小部件

EnergyBar开发者指南&#xff1a;如何创建自己的Touch Bar小部件 【免费下载链接】EnergyBar Supercharge your Macs Touch Bar. 项目地址: https://gitcode.com/gh_mirrors/en/EnergyBar EnergyBar是一款能让你的Mac Touch Bar更强大的工具&#xff0c;它允许用户自定义…

作者头像 李华
网站建设 2026/7/6 18:58:41

2026论文神级降AIGC网站大曝光:一键把AIGC率降至安全线!

2026年的学术战场已经彻底改天换地&#xff0c;学生们从过去单纯为“查重率”发愁&#xff0c;到现在被“AIGC率”折磨得焦头烂额。AI检测技术越来越聪明&#xff0c;高校的审核标准也越收越紧&#xff0c;现在的论文不仅要避开重复内容&#xff0c;还得彻底摆脱AI的痕迹。光是…

作者头像 李华