Uno Platform WASM调用SignalR时TestModel反序列化异常问题
问题根因
你遇到的异常是Uno Platform WASM构建默认开启IL裁剪导致的:WASM构建时会移除所有未被显式调用的类成员以减少包体积,TestModel的无参构造函数仅在SignalR反序列化时通过反射调用,没有被裁剪器扫描到所以被移除;LocationModel因为被其他代码显式引用过构造函数,所以没有被裁剪,可正常反序列化。UWP构建默认不执行激进的IL裁剪,所以运行正常。
解决方案
按优先级选择即可:
- 方案1:标记模型防止裁剪(最简单快速)
在模型类上添加Uno的[Preserve]特性,并显式声明无参构造函数,确保构造函数和属性不被裁剪:
using Uno; namespace ReservationManagement.SignalRInterface.Model { [Preserve(AllMembers = true)] public class TestModel { // 显式声明无参构造函数 public TestModel(){} public string Name { get; set; } public override string ToString() { return Name; } } }
建议将所有用于SignalR传输的模型都加上该特性,避免后续其他模型出现同类问题。
- 方案2:使用System.Text.Json源生成序列化(性能最优)
避免运行时反射依赖,同时不需要全局关闭裁剪:
- 客户端项目中新增序列化上下文类,注册所有需要反序列化的模型:
using System.Text.Json.Serialization; using ReservationManagement.SignalRInterface.Model; [JsonSerializable(typeof(TestModel))] [JsonSerializable(typeof(LocationModel))] public partial class AppJsonSerializerContext : JsonSerializerContext { }
- 构建HubConnection时指定使用源生成的序列化配置:
HubConnection = new HubConnectionBuilder() .WithUrl("http://localhost:5000/TestServiceHubAnyOrigin") .WithAutomaticReconnect() .AddJsonProtocol(options => { options.PayloadSerializerOptions.TypeInfoResolver = AppJsonSerializerContext.Default; }) .Build();
- 方案3:临时关闭IL裁剪(仅用于验证问题)
如果需要快速确认是否为裁剪导致的问题,可在WASM项目的.csproj文件中添加配置关闭裁剪:
<PropertyGroup> <WasmILLink>False</WasmILLink> </PropertyGroup>
验证正常后还是建议使用前两个方案,关闭裁剪会大幅增加WASM包体积,影响加载性能。
内容的提问来源于stack exchange,提问作者Gareld
相关产品推荐
相关产品推荐

