es6的Symbol是不可序列化的吗

//下边的文字摘录自 Redux文档常见问题
为何 type 必须是字符串,或者⾄少可以被序列化?
为什么 action 类型应该作为常量?

答: 和 state ⼀样,可序列化的 action 使得若⼲ Redux 的经典特性变得可能,⽐
如时间旅⾏调试器、录制和重放 action。若使⽤ Symbol 等去定义 type
值,或者⽤ instanceof 对 action 做⾃检查都会破坏这些特性。字符串是可
序列化的、⾃解释型,所以是更好的选择。注意,如果 action ⽬的是在
middleware 中处理,那么使⽤ Symbols、 Promises 或者其它⾮可序列化值
也是 可以 的。 action 只有当它们正真到达 store 且被传递给 reducer 时才需
要被序列化。

我查了些资料,并没有找到Symbol是否可以序列化的说明。

阅读 4.2k
2 个回答

js中函数不能序列化,对象序列化也只是可以存储状态罢了

根据Mozilla的文档

Symbol-keyed properties will be completely ignored when using JSON.stringify()

因此若直接对包含Symbol的对象进行JSON.stringify()操作,则序列化后Symbol值会被清除。

若确实需要对Symbol值进行序列化,则可利用Symbol相关的方法Object.getOwnPropertySymbols()来获取Symbol值,而后手工将其序列化为有一定特殊性的字符串字段;反序列化时则识别此特殊性,并在反序列化成对象的过程中将其复原为Symbol值。

若需对上述过程进行自动化,可使用我写的小工具ESSerializer(https://www.npmjs.com/package...),该工具可以在序列化和反序列化过程中保留大多数内置类型/对象(包括Symbol),同时保留自定义类、继承等各种面向对象属性,支持循环引用结构。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题