Blazor Server中ProtectedBrowserStorage反序列化失败问题求助
问题分析与解决方法
核心问题
- AppState属性赋值错误:
Counter是private set属性,无法通过对象初始化器直接赋值,必须调用SetCounter方法。 - 序列化逻辑冲突:存储时手动将
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
相关产品推荐
相关产品推荐

