Skip to content
项目

JasonXuDeveloper/Nino has 660 GitHub stars and 59 forks. GitHot measured 0 stars in 24 hours. Last checked 2026-11-15 14:02 UTC. Last push 2026-11-15.

这些数字如何统计

实测星标增长

24小时
0
7天
正在收集历史
15天
正在收集历史
1个月
正在收集历史

各周期内的星标净变化,周期相互重叠,并非每日新增。缺失的测量保持空白。星标代表关注度,不代表软件质量。

关于

The fastest binary serializer for C#. Source-generated, zero-allocation, thread-safe and safe on untrusted input: .NET, Native AOT, Unity, Godot and HybridCLR, with Go, Rust and TypeScript writing and reading the same bytes.

开发工具

README.zh.md

原文
Nino logo

Nino

C# 最快的二进制序列化库。
源生成、零分配、线程安全,可放心读取不可信数据。
支持 .NET、Unity(Mono 和 IL2CPP)、Godot、Native AOT 和 HybridCLR,Go、Rust 和 TypeScript 也能读写,字节完全一致。

NuGet OpenUPM crates.io
npm Go
Build License Docs DeepWiki

官网 · 快速上手 · v4 新特性 · 性能 · QQ 群 · English

为什么选 Nino

  • 最快。 12 个真实业务场景下,序列化比 MemoryPack 快 1.5–5.4 倍,比 MessagePack 快 3.4–18 倍,比 protobuf-net 快 6.4–73 倍,比 Google.Protobuf 快 3.9–34 倍,比 System.Text.Json 快 4.3–136 倍。性能
  • 全平台 SIMD,Unity 里用 Burst。 针对 AVX-512、AVX2、SSSE3、Arm64 和 WebAssembly 手写向量路径,搬运元组、带填充的结构体和字符串;Unity 里用 Burst 内核,Go、Rust 和 TypeScript 也有各自的向量内核,其他平台走可移植代码,写出的字节相同。SIMD
  • 可放心读取不可信数据。 伪造的字节不会让进程崩溃,不会越界读取,不会分配与输入不成比例的内存,也无法指定要创建的类型;任何无效输入都只抛出 NinoDataException。不可信数据
  • 热路径零分配。 序列化到复用的 IBufferWriter<byte>,反序列化到已有对象或池化对象;线程安全,热路径上没有锁。零分配
  • 一切在编译期完成。 生成的格式化器直接读写成员,不对成员做反射,没有 IL emit,也无需注册;IL2CPP、Native AOT 和 HybridCLR 热更都能直接用。平台
  • 处处字节一致。 不论哪种运行时、哪种 CPU,写出的字节都相同;Go、Rust 和 TypeScript 通过 nino-gen 生成的代码读写同样的数据,写出的字节也完全一致。其他语言
  • 类型丰富,数据可演进。 多态无需标签,支持版本容错和键控类型、引用追踪、序列化回调,以及全部 BCL 集合。支持的类型
  • 写代码时就发现错误。 44 条分析器诊断,许多带一键修复;有了布局基线,存档或消息类型一旦改得让旧数据、旧版本读不了,马上就会标出来。分析器

安装

命令
.NET、Godot 4 dotnet add package Nino --prerelease .NET 8 及以上(针对 .NET 8 和 .NET 10 单独优化)、.NET Standard 2.1、Native AOT;扩展包 Nino.Immutable、Nino.AspNetCore、Nino.Codegen
Unity 2022.3+ openupm add com.jasonxudeveloper.nino Mono、IL2CPP、HybridCLR · 指南
Go 1.22+ go get github.com/JasonXuDeveloper/Nino/runtimes/go/v4 生成的代码或 struct tag · 指南
Rust 1.88+ cargo add nino-serialization 生成的代码或 --features derive · 指南
TypeScript npm install nino-serialization Node.js 和浏览器 · 指南

v4 还是预发行版,不加 --prerelease 时 NuGet 会装上 3.9.x,读不了 v4 的数据。Nino.Codegen 会在每次构建后把你的类型生成为 Go、Rust 或 TypeScript 代码(指南)。

快速开始

using Nino.Core;

[NinoType]
public sealed class Order
{
    public long Id;
    public string Customer;
    public List<OrderLine> Lines;
}

byte[] bytes = NinoSerializer.Serialize(order);
Order copy = NinoDeserializer.Deserialize<Order>(bytes);
NinoDeserializer.Deserialize(bytes, ref copy); // 直接填充同一个实例

多态无需标签:以基类型声明的值,读回来仍是它的运行时类型。

[NinoType] public abstract class Message { public int Seq; }
[NinoType] public sealed class Chat : Message { public string Text; }

byte[] bytes = NinoSerializer.Serialize<Message>(new Chat { Text = "hi" });
Message msg = NinoDeserializer.Deserialize<Message>(bytes); // 仍是 Chat

下一步:第一个类型、数据演进、引用追踪、对象池和高级用法。

AI 编程助手

npx skills add JasonXuDeveloper/Nino

装上 nino-serialization skill 后,Claude Code、Codex、Cursor、Copilot 等助手会正确声明 [NinoType]、选对数据格式,并能修好每一条 NINO 诊断。文档另有给模型读的 llms.txt 和 llms-full.txt。

性能

12 个真实场景 序列化 反序列化
对比 MemoryPack 快 1.5–5.4 倍 快 1.3–3.5 倍
对比 MessagePack 快 3.4–18 倍 快 2.2–12 倍
对比 protobuf-net 快 6.4–73 倍 快 3.8–35 倍
对比 Google.Protobuf 快 3.9–34 倍 快 2.3–32 倍
对比 System.Text.Json 快 4.3–136 倍 快 3.7–91 倍
反序列化到已有对象 — 0 B,比 MemoryPack 最多快 7.6 倍

这 12 个场景:jvm-serializers 的 MediaContent 和一页 Stack Exchange API 数据(MessagePack、MemoryPack 自己的基准用的就是这套模型);服务端的结果为接口的 RPC 调用、上个版本写进缓存的用户资料、两层事件继承外加泛型信封的事件流、一批日志;以及游戏真正会发的消息:读进客户端已有对象的状态同步快照、帧同步的输入帧、MMO 的 AOI 增量、共享对象的 SLG 地图区域和卡牌战斗回放,还有上个版本的放置游戏存档。每个库都用它最快的 API(Google.Protobuf 用自己生成的消息类型,System.Text.Json 用源生成器输出 UTF-8),缺的功能就用它常见的绕法(共享对象写成副本、读进已有对象改成新建)。区间只算 Nino 快出 5% 以上的场景,每个场景的耗时见文档。

真实场景 真实场景:Nino v4、v3 与各库每次操作的耗时,序列化与反序列化
基础类型与结构体 基础类型与结构体:Nino v4、v3 与各库每次操作的耗时,序列化与反序列化
多态 多态:Nino v4、v3 与各库每次操作的耗时,序列化与反序列化
可空值 可空值:Nino v4、v3 与各库每次操作的耗时,序列化与反序列化
集合与常用类型 集合与常用类型:Nino v4、v3 与各库每次操作的耗时,序列化与反序列化
复用与对象池 复用与对象池:Nino v4、v3 与各库每次操作的耗时,序列化与反序列化
引用跟踪与版本容错 引用跟踪与版本容错:Nino v4、v3 与各库每次操作的耗时,序列化与反序列化
其他 其他:Nino v4、v3 与各库每次操作的耗时,序列化与反序列化

BenchmarkDotNet 0.15.8,.NET 10.0.15,服务器 GC,AMD EPYC 9V74 3.69 GHz,GitHub runner 实测;所有库在同一次运行中测得,NuGet 上的 Nino 3.3.13 在同一台机器上紧接其前跑一次。那页 Stack Exchange 数据的大小:Nino 123,333 字节,MemoryPack 134,223 字节,MessagePack 115,778 字节,protobuf(两个库相同)118,660 字节,JSON 208,038 字节。测试方法与全部用例见 docs/v4-benchmarks.md。

更多:全部 .NET 用例与 Arm64、Unity 与 Burst和 Go、Rust 和 TypeScript。

适用场景

  • 服务与进程间通信:每次调用零分配,可安全并发;ASP.NET Core 以 application/x-nino 读写请求体与响应。
  • RPC 与网络层:直接写进 PipeWriter,也能直接从 PipeReader 的 ReadOnlySequence<byte> 读出,消息可池化复用;伪造的消息只会抛异常,不会让服务端崩溃。
  • 消息队列、缓存和存储:多态事件,数据小巧,字段可以跨版本增加、调序和删除。
  • 网页、Node、Go 与 Rust:每次构建后生成类型和编解码器,与 .NET 互相读写,字节一致。
  • Unity:Mono 和 IL2CPP,HybridCLR 无需初始化,Burst SIMD 内核,内置 AnimationCurve 和 Gradient。
  • Godot 4(.NET):直接引用 NuGet 包;Vector3、Transform3D 等数学结构体按原始内存拷贝。

与其他序列化库对比

Nino v4 MemoryPack MessagePack protobuf System.Text.Json
格式 二进制,值不带标签 二进制,内存布局 MessagePack,自描述 Protocol Buffers,字段编号 JSON 文本
不可信输入 默认安全,只有一种异常 "仅用于可信数据" 需开启 UntrustedData 深度上限 深度上限
多态 自动,任何基类或接口 [MemoryPackUnion] 标签 [Union] 键 [ProtoInclude] 编号、oneof 每个子类一个 [JsonDerivedType]
共享与循环引用 trackReferences 循环引用 不支持 不支持 ReferenceHandler.Preserve
反序列化到已有对象 原地复用,0 B 清空集合,重建元素 不支持 合并,不能覆盖 仅成员(Populate)
其他语言 Go、Rust、TypeScript,从 C# 类型生成 TypeScript 任何 MessagePack 库 任何 protobuf 库 任何语言

protobuf 一列指 protobuf-net 和 Google.Protobuf。怎么选、Nino 有哪些局限,见序列化库选型。详细对比:MemoryPack、 MessagePack、protobuf-net。

v4 对比 v3

v4 重写了运行时和生成器;二进制格式与 v3 不兼容。

v4 对比 v3(3.3.13)
序列化 类快 1.9 倍,类数组快 2.4 倍,结构体持平,结构体数组快 1.2 倍
反序列化 类快 1.5 倍,类数组快 1.5 倍,结构体持平,结构体数组持平
构建 1,100 个类型时生成代码的编译快 188 倍(193 秒 → 1.03 秒);源码小 12 倍

v4 新特性 · 更新日志 · 迁移指南

参与贡献

欢迎提交 Issue 和 Pull Request,详见 CONTRIBUTING.md;安全问题请按 SECURITY.md 私下报告。使用问题和交流讨论欢迎加 QQ 群 1054653934。

许可证

MIT © JasonXuDeveloper