You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor Server中ProtectedBrowserStorage反序列化失败问题求助

问题分析与解决方法

核心问题

  1. AppState属性赋值错误:Counter是private set属性,无法通过对象初始化器直接赋值,必须调用SetCounter方法。
  2. 序列化逻辑冲突:存储时手动将AppState序列化为字符串,而ProtectedBrowserStorage.SetAsync<T>本身会自动序列化对象,导致最终存储的是「字符串的JSON序列化结果」(双重序列化),读取时类型不匹配报错。

正确实现方式(推荐)

1. 修正存储逻辑(利用内置自动序列化)

ProtectedBrowserStorage会自动处理对象的序列化/反序列化,无需手动调用JsonSerializer,同时通过SetCounter方法设置计数器值:

private async Task IncrementCount()
{
    currentCount++;
    var appState = new AppState();
    appState.SetCounter(currentCount);
    await SessionStorage.SetAsync(nameof(AppState), appState);
}

2. 读取逻辑保持不变

直接读取即可,GetAsync<AppState>会自动将存储的JSON反序列化为AppState对象:

protected override async Task OnAfterRenderAsync(bool firstRender)
{
    if (firstRender)
    {
        var result = await SessionStorage.GetAsync<AppState>(nameof(AppState));
        state = result.Value;
    }
}

若坚持手动序列化(不推荐)

如果一定要手动处理序列化,需保证存储和读取逻辑统一:

1. 存储时手动序列化字符串

private async Task IncrementCount()
{
    currentCount++;
    var appState = new AppState();
    appState.SetCounter(currentCount);
    string json = JsonSerializer.Serialize(appState);
    await SessionStorage.SetAsync(nameof(AppState), json);
}

2. 读取时先读字符串再反序列化

protected override async Task OnAfterRenderAsync(bool firstRender)
{
    if (firstRender)
    {
        var result = await SessionStorage.GetAsync<string>(nameof(AppState));
        if (!string.IsNullOrEmpty(result.Value))
        {
            state = JsonSerializer.Deserialize<AppState>(result.Value);
        }
    }
}

额外注意

  • AppState类需保留无参构造函数(默认自动生成,当前代码满足要求),否则JSON反序列化会失败。
  • 反序列化后的AppState对象,OnChange事件不会自动绑定,需根据业务需求重新订阅。

内容的提问来源于stack exchange,提问作者sada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:36:05