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

如何在Zustand中持久化Map与Set?解决序列化兼容问题

解决Zustand持久化Set/Map无法还原的问题

由于JSON本身不支持Set和Map类型,Zustand默认的JSON序列化会将它们转为普通对象,导致读取时无法还原。旧版Zustand中使用的serialize/deserialize方法已被弃用,现在可以通过persist中间件的transform配置来处理类型转换:

修改后的完整代码

import AsyncStorage from "@react-native-async-storage/async-storage"
import { create } from "zustand"
import { createJSONStorage, persist } from "zustand/middleware"

interface Store {
    names: Set<string>
    addName: (name: string) => void
    removeName: (name: string) => void
}

export const useStore = create<Store>()(
    persist(
        (set) => ({
            names: new Set(),
            addName: (name: string) => {
                set((state) => {
                    const names = new Set(state.names)
                    names.add(name)
                    return { names }
                })
            },
            removeName: (name: string) => {
                set((state) => {
                    const names = new Set(state.names)
                    names.delete(name)
                    return { names }
                })
            }
        }),
        {
            name: "domain-storage",
            storage: createJSONStorage(() => AsyncStorage),
            transform: {
                // 将状态转为可序列化的格式(Set转数组)
                outbound: (state) => ({
                    ...state,
                    names: Array.from(state.names),
                }),
                // 从存储数据还原为原始状态(数组转Set)
                inbound: (storedState) => ({
                    ...storedState,
                    names: new Set(storedState.names),
                }),
            },
        }
    )
)

核心逻辑说明

  • transform.outbound:在状态写入存储前执行,把Set<string>转换为JSON支持的数组格式,确保能正常序列化存储。
  • transform.inbound:从存储读取数据后执行,把数组重新转换为Set<string>,还原原始状态类型。

扩展到Map类型的处理

如果需要持久化Map,转换逻辑类似:

transform: {
    outbound: (state) => ({
        ...state,
        // Map转二维数组
        someMap: Array.from(state.someMap.entries()),
    }),
    inbound: (storedState) => ({
        ...storedState,
        // 二维数组转Map
        someMap: new Map(storedState.someMap),
    }),
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:49:59