尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

NATS.Net序列化完全攻略:JSON、ProtoBuf与自定义序列化器一网打尽

NATS.Net序列化完全攻略:JSON、ProtoBuf与自定义序列化器一网打尽 NATS.Net序列化完全攻略JSON、ProtoBuf与自定义序列化器一网打尽【免费下载链接】nats.netThe official C# Client for NATS项目地址: https://gitcode.com/gh_mirrors/na/nats.netNATS.Net 是 NATS 官方出品的 C# 客户端库而序列化是使用它的第一道关卡消息在网络上传输的都是字节如何优雅地把 .NET 对象变成字节、再变回来直接决定了你的代码简洁度和性能上限。这篇 NATS.Net 序列化攻略将带你快速掌握 JSON、ProtoBuf 和自定义序列化器的完整用法新手也能照着做。一、NATS.Net 序列化体系速览三层自动适配NATS.Net 的序列化设计非常聪明——它默认会按类型自动选择最合适的序列化器你可以完全无感地使用。它的核心接口定义在 INatsSerialize.cs只有两个方法Serialize(IBufferWriterbyte, T)把对象写入缓冲区Deserialize(ReadOnlySequencebyte)从字节还原对象默认的NatsClient内置了一条序列化器链见 NatsClientDefaultSerializer.cs消息类型自动使用的序列化器效果byte[]、Memorybyte、ReadOnlyMemorybyte原始字节序列化器零拷贝直通最快string、int、long、Guid、DateTime、bool等UTF-8 原始类型序列化器直接以文本传输可读性好其他任意复杂对象JSON 序列化器自动序列化为 JSON这意味着你什么都不用配直接发布一个对象就能用 JSON 收发。这套默认即 JSON的设计让 NATS.Net 用起来像 Redis 客户端一样简单。二、最快上手方式NATS.Net JSON 序列化三步走JSON 是绝大多数场景的首选。NATS.Net 把 JSON 序列化做到了开箱即用你只需三步安装NATS.Net包已包含NATS.Client.Serializers.Json序列化器创建NatsClient连接直接PublishAsync/SubscribeAsync发布和订阅你的模型参考官方示例 Example.Core.PublishModel/Program.cs发布一个对象只需一行await using var connection new NatsConnection(options); await connection.PublishAsync(subject, new Bar { Id i, Name Baz });订阅端同样简洁await foreach (var msg in connection.SubscribeAsyncBar(bar.*)) { Console.WriteLine(${msg.Data.Id}: {msg.Data.Name}); }整个流程中你几乎看不到任何序列化代码NATS.Net 已默默替你完成了 JSON 编码与解码。三、显式配置 JSON 序列化器控制选项与行为默认 JSON 序列化器会自动忽略null值写入。如果你需要自定义 JSON 选项如命名策略、枚举转字符串等可以显式指定NatsJsonSerializerRegistryvar options NatsOpts.Default with { SerializerRegistry NatsJsonSerializerRegistry.Default, }; await using var connection new NatsConnection(options);NatsOpts.SerializerRegistry就是全局序列化器的挂载点见 NatsOpts.cs。而NatsJsonSerializer的实现位于 NatsJsonSerializer.cs它基于System.Text.Json复用了线程静态的Utf8JsonWriter来减少分配性能表现相当出色。 提示反射式 JSON 序列化不适合 Native AOT 场景AOT 部署请用下面的源码生成方案。四、Native AOT 场景使用源码生成 JSON 序列化如果你的应用要发布为 Native AOT原生单文件反射式 JSON 会失效。NATS.Net 为此提供了基于JsonSerializerContext的源码生成序列化器NatsJsonContextSerializerRegistry同样定义在 INatsSerialize.cs 中var options NatsOpts.Default with { SerializerRegistry new NatsJsonContextSerializerRegistry(MyJsonContext.Default), };配合[JsonSerializable(typeof(MyModel))]标注的生成上下文即可在 AOT 下享受无反射、高性能的 JSON 序列化。官方示例 Example.NativeAot 展示了完整用法。五、ProtoBuf 集成实战NATS.Net Google.Protobuf追求极致性能或跨语言互通时ProtoBuf 是比 JSON 更优的选择。NATS.Net 没有绑定任何特定二进制格式你可以很自然地接入 ProtoBuf。官方示例 Example.ProtoBufMessages 给出了标准姿势编写.proto文件见 greeting.protosyntax proto3; message Greeting { int32 id 1; string name 2; }在 Example.ProtoBufMessages.csproj 中引入Google.Protobuf和Grpc.Tools并声明 Protobuf 编译项ItemGroup PackageReference IncludeGoogle.Protobuf Version3.29.3 / PackageReference IncludeGrpc.Tools Version2.69.0 / Protobuf Include**\*.proto GrpcServicesnone / /ItemGroup发布时用Greeting.ToByteArray()得到字节数组订阅端用Greeting.Parser.ParseFrom(msg.Data)还原。因为字节数组走的是原生序列化通道几乎没有额外开销。六、自定义序列化器完整指南实现 INatsSerializer 接口当 JSON、ProtoBuf 都不满足需求时比如 MessagePack、自定义加密、压缩格式你可以实现自己的序列化器。核心是继承INatsSerializerT接口并实现两个方法然后通过NatsSerializerBuilderT串成链public class MySerializerT : INatsSerializerT { public void Serialize(IBufferWriterbyte bufferWriter, T value) { // 你的编码逻辑 } public T? Deserialize(in ReadOnlySequencebyte buffer) { // 你的解码逻辑 } public INatsSerializerT CombineWith(INatsSerializerT next) new MySerializerT(); }链式构建时序列化器会按加入的逆序组合先尝试链头的类型不支持再向后传递参考 INatsSerialize.cs 中NatsSerializerBuilderT.Build()的实现。这样你就能实现原始类型走最快路径、复杂对象走 JSON的分级策略。七、按消息粒度指定序列化器更精细的控制除了全局注册表NATS.Net 还允许你在单条消息级别指定序列化器。NatsClient的发布与订阅方法都暴露了可选的 serializer 参数见 NatsClient.cs// 发布时指定 await client.PublishAsync(subject, data, serializer: mySerializer); // 订阅时指定 await foreach (var msg in client.SubscribeAsyncT(subject, serializer: myDeserializer)) { }这条特性让同一个连接可以同时承载不同格式的消息流特别适合消息网关或协议适配场景。八、序列化性能与选型建议最后给出一份 NATS.Net 序列化选型清单追求极致吞吐、传输二进制直接发byte[]/Memorybyte走原始字节通道零序列化开销开发效率优先、调试友好默认 JSON看日志一眼就懂推荐 90% 的业务场景跨语言互通、追求小体积ProtoBuf / MessagePack 等自定义二进制序列化器Native AOT 部署务必使用源码生成的NatsJsonContextSerializerRegistry否则启动即崩混合场景用NatsSerializerBuilderT构建链式序列化器 按消息粒度覆盖。NATS.Net 的序列化设计把易用和性能平衡得相当好默认开箱即用进阶时每一层都可替换、可组合。希望这份 NATS.Net 序列化攻略能帮你少踩坑把精力留给业务本身。动手试试吧——先从克隆 NATS.Net 仓库git clone https://gitcode.com/gh_mirrors/na/nats.net跑一遍 examples 目录下的官方示例开始你会很快找到手感。【免费下载链接】nats.netThe official C# Client for NATS项目地址: https://gitcode.com/gh_mirrors/na/nats.net创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表