You need to enable JavaScript to run this app. Uno Platform WASM调用SignalR时TestModel反序列化异常问题
优惠活动
大模型
产品
解决方案
定价
更多

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源生成序列化(性能最优)
    避免运行时反射依赖,同时不需要全局关闭裁剪:
  1. 客户端项目中新增序列化上下文类,注册所有需要反序列化的模型:
using System.Text.Json.Serialization;
using ReservationManagement.SignalRInterface.Model;

[JsonSerializable(typeof(TestModel))]
[JsonSerializable(typeof(LocationModel))]
public partial class AppJsonSerializerContext : JsonSerializerContext
{
}
  1. 构建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 06:45:08