Orleans 序列化错误调用流程图
文本版流程图
┌─────────────────────────────────────────────────────────────────┐
│ Orleans 序列化错误调用流程 │
└─────────────────────────────────────────────────────────────────┘
1. 应用程序启动
└─ Program.cs:198
└─ Host.RunAsync()
└─ Host.StartAsync()
└─ SiloHostedService 构造函数
└─ ValidateSystemConfiguration()
└─ SerializerConfigurationValidator.ValidateConfiguration()
└─ SerializerConfigurationAnalyzer.AnalyzeSerializerAvailability()
└─ VisitType() 检查类型编解码器
└─ CodecProvider.TryGetCodec()
└─ TryCreateCodec()
└─ CreateCodecInstance()
└─ ListCodec<ChatMessage> 构造函数
└─ OrleansGeneratedCodeHelper.UnwrapService()
└─ FieldCodecHolder.get_Value()
└─ CodecProvider.GetCodec<ChatMessage>()
└─ TryGetCodec() 返回 null?
├─ 是 → ThrowCodecNotFound()
│ └─ 抛出 CodecNotFoundException
│ └─ ❌ 错误: Could not find a codec for type
│ SocialApp.Shared.Models.ChatMessage
└─ 否 → 返回编解码器 ✅
关键决策点: TryGetCodec 返回 null?
├─ 返回 null → 系统找不到 ChatMessage 的编解码器 → 启动失败
└─ 返回编解码器 → 正常启动
可视化流程图
启动阶段 (蓝色)
↓
Program.cs:198 ──→ Host.RunAsync() ──→ SiloHostedService 构造函数
↓
配置验证阶段 (橙色)
↓
ValidateSystemConfiguration() ──→ SerializerConfigurationValidator
↓
序列化分析阶段
↓
SerializerConfigurationAnalyzer ──→ VisitType() ──→ CodecProvider.TryGetCodec()
↓
编解码器创建阶段
↓
TryCreateCodec() ──→ CreateCodecInstance() ──→ ListCodec<ChatMessage> 构造函数
↓
服务解包阶段
↓
OrleansGeneratedCodeHelper.UnwrapService() ──→ FieldCodecHolder.get_Value()
↓
最终检查阶段 (红色 - 错误发生点)
↓
CodecProvider.GetCodec<ChatMessage>() ──→ TryGetCodec() 返回 null?
↓
├─ 是 → ThrowCodecNotFound() ──→ ❌ CodecNotFoundException
└─ 否 → ✅ 返回编解码器
详细说明
1. 启动阶段
- Program.cs:198: 应用程序入口点,调用
Host.RunAsync() - Host.StartAsync(): 主机开始启动所有注册的服务
2. Silo 服务初始化
- SiloHostedService 构造函数: 创建 Silo 托管服务
- ValidateSystemConfiguration: 验证系统配置,包括序列化配置
3. 序列化配置验证
- SerializerConfigurationValidator: 序列化配置验证器
- SerializerConfigurationAnalyzer: 分析序列化器的可用性
- VisitType: 检查每个类型是否有对应的编解码器
4. 编解码器查找和创建
- CodecProvider.TryGetCodec: 尝试获取现有编解码器
- TryCreateCodec: 如果没有找到,尝试创建新的编解码器
- CreateCodecInstance: 创建编解码器实例
5. List 编解码器创建
- ListCodec<ChatMessage> 构造函数: 为
List<ChatMessage>创建编解码器 - OrleansGeneratedCodeHelper.UnwrapService: 解包服务依赖
- FieldCodecHolder.get_Value: 获取字段编解码器
6. 错误发生点
- CodecProvider.GetCodec<ChatMessage>: 尝试获取
ChatMessage的编解码器 - ThrowCodecNotFound: 因为找不到编解码器而抛出异常
问题根源
系统在启动时验证配置,发现 List<ChatMessage> 需要序列化,但 ChatMessage 类型没有注册相应的编解码器,导致整个启动过程失败。
解决方案
需要在应用程序启动时配置序列化器以支持 ChatMessage 类型:
builder.Services.AddSerializer(serializerBuilder =>
{
serializerBuilder.AddJsonSerializer(
isSupported: type => type.Namespace?.StartsWith("SocialApp.Shared.Models") == true);
});
1769

被折叠的 条评论
为什么被折叠?



