using MessagePack;

namespace Dpz.Core.WebApi.MessagePackFormatters;

/// <summary>
///     MessagePack 格式化选项
/// </summary>
public class MessagePackFormatterOptions
{
    /// <summary>
    ///     内容协商时使用的默认Content-Type
    /// </summary>
    public const string DefaultContentType = "application/x-msgpack";

    /// <summary>
    ///      默认文件扩展名
    /// </summary>
    public const string DefaultFileExtension = "msgpack";

    /// <summary>
    ///     关联类型 (默认 <see cref="DefaultContentType" />).
    /// </summary>
    public HashSet<string> MediaTypes { get; } = [DefaultContentType];

    /// <summary>
    ///     关联的格式映射 (默认 <see cref="DefaultFileExtension" />) (不区分大小写).
    ///     <seealso cref="MvcOptions.FormatterMappings" />
    /// </summary>
    /// <remarks>
    ///     详细信息参考
    ///     https://learn.microsoft.com/en-us/aspnet/core/web-api/advanced/formatting
    /// </remarks>
    public HashSet<string> FileExtensions { get; } =
        new HashSet<string>(StringComparer.OrdinalIgnoreCase) { DefaultFileExtension };

    /// <summary>
    ///     格式化器解析器
    /// </summary>
    public IFormatterResolver? FormatterResolver { get; set; }

    /// <summary>
    ///     应用于序列化序列的压缩方案,参见 <see cref="MessagePackSerializerOptions.Compression" />.
    /// </summary>
    public MessagePackCompression Compression { get; set; }

    /// <summary>
    ///     使用旧规范进行序列化
    ///     详情查看 <see cref="MessagePackSerializerOptions.OldSpec" />
    /// </summary>
    /// <remarks>
    ///     读取时始终支持新旧规范
    /// </remarks>
    public bool? UseOldSpecification { get; set; }

    /// <summary>
    ///     指示在使用无类型格式化器时,是否应省略程序集版本、文化和公钥标记元数据,默认值为 <c>false</c>
    ///     详细信息参考 <see cref="MessagePackSerializerOptions.OmitAssemblyVersion" />
    /// </summary>
    public bool OmitAssemblyVersion { get; set; }

    /// <summary>
    ///     允许反序列化器在找不到匹配版本时实例化来自不同版本程序集的类型,默认值为 <c>false</c>.
    ///     详细信息参考 <see cref="MessagePackSerializerOptions.AllowAssemblyVersionMismatch" />
    /// </summary>
    public bool AllowAssemblyVersionMismatch { get; set; }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这是一个用于配置 MessagePack 格式化器的选项类。让我详细解释一下这个代码:

类的用途

MessagePackFormatterOptions 是一个配置类,用于定义 MessagePack 序列化格式化器在 ASP.NET Core Web API 中的各种行为参数。

主要组成部分

1. 常量定义

public const string DefaultContentType = "application/x-msgpack";
public const string DefaultFileExtension = "msgpack";
  • 定义了默认的 MIME 类型和文件扩展名
  • 这些是 MessagePack 格式的标准标识符

2. 媒体类型和文件扩展名配置

public HashSet<string> MediaTypes { get; } = [DefaultContentType];
public HashSet<string> FileExtensions { get; } = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { DefaultFileExtension };
  • MediaTypes:定义支持的 Content-Type,用于内容协商
  • FileExtensions:定义支持的文件扩展名映射,不区分大小写

3. MessagePack 特定配置

格式化器解析器

public IFormatterResolver? FormatterResolver { get; set; }
  • 用于自定义序列化/反序列化的解析器
  • 可以控制如何处理特定类型的对象

压缩设置

public MessagePackCompression Compression { get; set; }
  • 配置序列化时使用的压缩算法
  • 可以提高传输效率,减少数据大小

规范版本控制

public bool? UseOldSpecification { get; set; }
  • 控制是否使用 MessagePack 的旧版规范进行序列化
  • 用于向后兼容性

程序集版本处理

public bool OmitAssemblyVersion { get; set; }
public bool AllowAssemblyVersionMismatch { get; set; }
  • OmitAssemblyVersion:序列化时是否省略程序集版本信息,减少数据大小
  • AllowAssemblyVersionMismatch:反序列化时是否允许程序集版本不匹配

使用场景

这个配置类通常用于:

  1. 在 ASP.NET Core 中注册 MessagePack 格式化器时的配置
  2. 自定义 MessagePack 序列化行为
  3. 处理版本兼容性问题
  4. 优化序列化性能和数据大小

设计特点

  • 使用了现代 C# 语法(如集合表达式 [DefaultContentType]
  • 提供了合理的默认值
  • 考虑了实际部署中的兼容性问题
  • 文档注释详细,包含了相关链接和说明

这是一个设计良好的配置类,为 MessagePack 在 Web API 中的使用提供了灵活的配置选项。

评论加载中...