Orleans CodeGenerator

部署运行你感兴趣的模型镜像

概述

Orleans.CodeGenerator 是 Orleans 框架中的核心代码生成器,它基于 Roslyn 编译器平台,在编译时自动生成序列化、反序列化、代理调用等关键代码,以优化 Orleans 应用的性能和类型安全。

核心组件架构

主要组件

  • OrleansSerializationSourceGenerator: 入口点,实现 ISourceGenerator 接口
  • CodeGenerator: 核心协调器,管理整个代码生成流程
  • SerializerGenerator: 生成序列化器代码
  • CopierGenerator: 生成深拷贝器代码
  • ProxyGenerator: 生成 RPC 代理代码
  • InvokableGenerator: 生成可调用对象代码
  • ActivatorGenerator: 生成对象激活器代码
  • MetadataGenerator: 生成元数据代码

支持的类型

  • 带有 [GenerateSerializer] 特性的类型
  • Grain 接口和实现
  • 可序列化的数据结构
  • F# 联合类型和记录类型
  • 泛型类型

详细工作流程时序图

MSBuild/编译器OrleansSerializationSourceGeneratorCodeGeneratorLibraryTypesMetadataModelSerializerGeneratorCopierGeneratorProxyGeneratorInvokableGeneratorActivatorGeneratorMetadataGenerator编译开始Execute(GeneratorExecutionContext)初始化阶段检查设计时构建标志解析配置选项new CodeGenerator(compilation, options)组件初始化FromCompilation(compilation, options)new MetadataModel()new SerializerGenerator(this)new CopierGenerator(this)new ProxyGenerator(this)new InvokableGenerator(this)new ActivatorGenerator(this)new MetadataGenerator(this)代码生成主流程GenerateCode(cancellationToken)1. 程序集分析阶段ComputeAssembliesToExamine()遍历所有引用的程序集收集 ApplicationPart 信息2. 类型扫描阶段检查类型特性创建 SerializableTypeDescription添加到 SerializableTypesalt[带有 GenerateSerializer 特性]VisitInterface()处理代理接口alt[接口类型]添加到 DetectedSerializers/Activators/Copiersalt[带有注册特性的类型]loop[遍历每个程序集中的类型]3. 序列化器生成阶段Generate(type)分析类型成员生成字段描述生成构造函数生成 Serialize 方法生成 Deserialize 方法生成 WriteField 方法生成 ReadValue 方法返回生成的类声明AddMember(namespace, classDeclaration)loop[遍历每个可序列化类型]4. 拷贝器生成阶段GenerateCopier(type, defaultCopiers)检查是否为浅拷贝类型生成字段描述生成构造函数生成 DeepCopy 方法生成成员拷贝逻辑alt[需要深拷贝]返回生成的拷贝器类AddMember(namespace, copierClass)loop[遍历每个可序列化类型]5. 激活器生成阶段GenerateActivator(type)分析构造函数参数生成字段声明生成构造函数生成 Create 方法返回生成的激活器类AddMember(namespace, activatorClass)loop[遍历每个可激活类型]6. 代理生成阶段Generate(interfaceDescription)生成字段描述生成构造函数生成代理方法生成异步调用逻辑返回生成的代理类AddMember(namespace, proxyClass)loop[遍历每个接口]7. 可调用对象生成阶段Generate(methodDescription)生成字段描述生成构造函数生成 SetTarget 方法生成 GetArgument 方法生成 SetArgument 方法生成 InvokeInner 方法返回生成的可调用对象类AddMember(namespace, invokableClass)loop[遍历每个方法]8. 元数据生成阶段GenerateMetadata()生成序列化器注册代码生成拷贝器注册代码生成转换器注册代码返回元数据类AddMember(metadataNamespace, metadataClass)9. 程序集特性生成生成 ApplicationPart 特性生成 TypeManifestProvider 特性10. 最终代码组装组织命名空间结构添加 using 语句生成 CompilationUnitSyntax返回完整的语法树转换为源代码字符串创建 SourceTextAddSource("assembly.orleans.g.cs", sourceText)编译完成MSBuild/编译器OrleansSerializationSourceGeneratorCodeGeneratorLibraryTypesMetadataModelSerializerGeneratorCopierGeneratorProxyGeneratorInvokableGeneratorActivatorGeneratorMetadataGenerator

关键特性详解

1. 序列化器生成 (SerializerGenerator)

功能: 为标记了 [GenerateSerializer] 的类型生成高效的序列化/反序列化代码

主要特性:

  • 使用字段 ID 增量编码,支持版本兼容性
  • 支持引用跟踪、循环引用检测
  • 支持序列化钩子 (OnSerializing, OnSerialized, OnDeserializing, OnDeserialized)
  • 自动处理泛型类型和嵌套类型
  • 优化内存使用,避免不必要的分配

生成的代码结构:

[GeneratedCode("OrleansCodeGen", "1.0.0.0")]
internal sealed class Codec_MyData
{
    private readonly IFieldCodec<string> _codec0;
    private readonly IFieldCodec<int> _codec1;
    
    public Codec_MyData(ICodecProvider codecProvider)
    {
        _codec0 = OrleansGeneratedCodeHelper.GetService<IFieldCodec<string>>(this, codecProvider);
        _codec1 = OrleansGeneratedCodeHelper.GetService<IFieldCodec<int>>(this, codecProvider);
    }
    
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public void Serialize<TBufferWriter>(ref Writer<TBufferWriter> writer, MyData instance) 
        where TBufferWriter : IBufferWriter<byte>
    {
        _codec0.WriteField(ref writer, 1, typeof(string), instance.Name);
        _codec1.WriteField(ref writer, 1, typeof(int), instance.Age);
    }
    
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public void Deserialize<TReaderInput>(ref Reader<TReaderInput> reader, MyData instance)
    {
        // 反序列化逻辑
    }
}

2. 拷贝器生成 (CopierGenerator)

功能: 生成深拷贝和浅拷贝逻辑

智能检测:

  • 自动判断类型是否需要深拷贝
  • 对不可变类型使用浅拷贝
  • 支持异常类型的特殊处理
  • 处理继承关系和基类拷贝

性能优化:

  • 对值类型使用直接拷贝
  • 对引用类型使用引用跟踪
  • 支持对象池和内存复用

3. 代理生成 (ProxyGenerator)

功能: 为 Grain 接口生成客户端代理

主要特性:

  • 自动处理 Task/ValueTask 返回类型
  • 支持异步和同步方法调用
  • 编译时类型检查,避免运行时错误
  • 支持泛型接口和方法
  • 自动处理参数序列化

生成的代理方法示例:

public async Task<string> GetNameAsync(int id)
{
    var request = new Invokable_IGrain_GetNameAsync_1();
    request.arg0 = id;
    return await base.InvokeAsync<string>(request);
}

4. 可调用对象生成 (InvokableGenerator)

功能: 生成服务端方法调用的包装对象

主要特性:

  • 自动处理参数序列化和传递
  • 支持对象池和资源清理
  • 生成方法元数据信息
  • 支持响应超时配置
  • 处理目标对象设置和获取

生成的方法:

  • SetTarget(ITargetHolder holder): 设置目标对象
  • GetTarget(): 获取目标对象
  • GetArgument(int index): 获取参数
  • SetArgument(int index, object value): 设置参数
  • InvokeInner(): 执行实际方法调用

5. 激活器生成 (ActivatorGenerator)

功能: 生成对象实例化代码

主要特性:

  • 支持带参数的构造函数
  • 集成 Orleans 的依赖注入系统
  • 自动处理泛型类型参数
  • 支持自定义激活逻辑

配置选项

public class CodeGeneratorOptions
{
    // 序列化器生成特性列表
    public List<string> GenerateSerializerAttributes { get; } = new() { "Orleans.GenerateSerializerAttribute" };
    
    // ID 特性列表
    public List<string> IdAttributes { get; } = new() { "Orleans.IdAttribute" };
    
    // 别名特性列表
    public List<string> AliasAttributes { get; } = new() { "Orleans.AliasAttribute" };
    
    // 不可变特性列表
    public List<string> ImmutableAttributes { get; } = new() { "Orleans.ImmutableAttribute" };
    
    // 构造函数特性列表
    public List<string> ConstructorAttributes { get; } = new() { "Orleans.OrleansConstructorAttribute" };
    
    // 字段 ID 生成策略
    public GenerateFieldIds GenerateFieldIds { get; set; }
    
    // 是否生成兼容性调用器
    public bool GenerateCompatibilityInvokers { get; set; }
}

使用示例

1. 基本序列化类型

[GenerateSerializer]
public class UserData
{
    [Id(0)]
    public string Name { get; set; }
    
    [Id(1)]
    public int Age { get; set; }
    
    [Id(2)]
    public DateTime CreatedAt { get; set; }
}

2. Grain 接口

public interface IUserGrain : IGrainWithStringKey
{
    Task<UserData> GetUserAsync();
    Task UpdateUserAsync(UserData userData);
    Task DeleteUserAsync();
}

3. F# 联合类型

[<GenerateSerializer>]
type UserStatus = 
    | Active of string
    | Inactive of DateTime
    | Suspended of string * DateTime

性能优势

1. 编译时优化

  • 避免运行时反射: 所有类型信息在编译时确定
  • 内联优化: 使用 MethodImplOptions.AggressiveInlining 特性
  • 直接方法调用: 避免虚方法调用的开销

2. 类型安全

  • 编译时类型检查: 所有类型错误在编译时发现
  • 强类型接口: 避免字符串和动态类型的使用
  • 泛型支持: 完整的泛型类型支持

3. 内存效率

  • 优化的序列化格式: 使用字段 ID 增量编码
  • 对象池支持: 减少 GC 压力
  • 引用跟踪: 避免循环引用的内存泄漏

4. 版本兼容

  • 向前兼容: 新版本可以读取旧版本的数据
  • 向后兼容: 旧版本可以跳过未知字段
  • 字段 ID 管理: 自动处理字段的添加和删除

诊断和调试

1. 诊断信息

代码生成器会生成详细的诊断信息,包括:

  • 无法访问的类型警告
  • 序列化配置错误
  • 类型兼容性问题

2. 调试支持

  • 支持附加调试器到代码生成过程
  • 生成详细的错误堆栈信息
  • 提供配置选项验证

3. 性能分析

  • 生成代码的性能统计
  • 序列化/反序列化时间分析
  • 内存使用情况报告

最佳实践

1. 类型设计

  • 使用 [Id] 特性明确指定字段 ID
  • 避免频繁更改字段 ID
  • 使用不可变类型提高性能

2. 版本管理

  • 为重要类型提供版本信息
  • 使用 [Alias] 特性支持类型重命名
  • 谨慎处理字段的删除和重命名

3. 性能优化

  • 使用 [Immutable] 特性标记不可变类型
  • 避免深度嵌套的对象结构
  • 考虑使用对象池减少 GC 压力

总结

Orleans.CodeGenerator 是一个高度优化的代码生成系统,它通过编译时代码生成显著提升了 Orleans 应用的性能和类型安全性。其模块化的设计使得每个组件都有明确的职责,整个系统协同工作,为 Orleans 框架提供了强大的序列化和 RPC 调用基础设施。

主要优势包括:

  • 高性能: 编译时优化,避免运行时反射
  • 类型安全: 编译时类型检查,减少运行时错误
  • 高度可配置: 支持多种配置选项和自定义特性
  • 版本兼容: 支持序列化格式的向前向后兼容
  • 易于使用: 简单的特性标记即可启用代码生成

这个系统是 Orleans 框架能够提供高性能分布式计算能力的重要基础之一。

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

helloworddm

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值