【发布时间】:2015-01-29 22:40:16
【问题描述】:
我想利用 Dart 的新(实验性)enum 功能而不是使用静态 const 字符串堆栈,但是使用 JSON 序列化/反序列化 enum 变量的最佳方法是什么?我已经让它以这种方式工作,但肯定有更好的解决方案:
enum Status {
none,
running,
stopped,
paused
}
Status status1 = Status.stopped;
Status status2 = Status.none;
String json = JSON.encode(status1.index);
print(json); // prints 2
int index = JSON.decode(json);
status2 = Status.values[index];
print(status2); // prints Status.stopped
如果您使用索引进行序列化,您可能会被锁定为使您的枚举永远保持相同的顺序,所以我更喜欢使用某种字符串形式。有人知道吗?
【问题讨论】:
-
我认为您也需要枚举名称(如类型名称)。如果您没有枚举名称,您怎么知道要反序列化到哪种类型。您还应该意识到,为了持久性等目的而序列化/反序列化枚举并不是一个好主意。如果您在现有值之前的某处添加一个值,则给定名称的索引可能会更改并破坏序列化/反序列化,因为 Dart 枚举不允许分配自定义枚举值。
-
是的,正是,冈特。正如我在问题中提到的那样,以这种方式使用索引似乎很脆弱,但我看不到另一种方式。我希望能够在客户端和服务器应用程序之间的通信中使用枚举,但除非其他人提出更多见解,否则我现在只能坚持使用字符串。
-
如果您仅将它用于客户端/服务器并共享实现,我认为使用枚举很好。我发现解决方法(具有静态值的类)更灵活,而且创建起来也不太冗长,除了最简单的情况外,更喜欢枚举。
-
枚举被设计为允许缩小,所以如果你想在浏览器中使用它们的名字作为字符串,这基本上归结为与使用缩小镜像相同的问题。我想说最好的方法是使用/构建一个序列化包,在开发时在服务器和 dartium 中可以使用镜像(甚至只是解析 toString 输出),但在构建时会自动为客户端生成序列化代码.
-
2021 年!现在你可以使用扩展了! medium.com/flutter/enums-with-extensions-dart-460c42ea51f7