我想使用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
如果使用索引进行序列化,则可以锁定以使您的枚举永远保持相同的顺序,因此我更喜欢使用某种String形式。有人想出来了吗?
答案 0 :(得分:2)
作为之前建议的答案之一,如果您在客户端和服务器上共享相同的实现,那么序列化名称是我认为最好的方式并尊重S.O.L.I.D design中的开放/封闭原则,说明:
“软件实体(类,模块,函数等)应该是可以扩展的,但是关闭以进行修改”
如果您需要将另一个成员添加到Enum,则使用索引而不是名称会破坏代码的所有逻辑。但是,使用该名称将允许扩展名。
底线,序列化枚举的名称,并为了正确反序列化,编写一个给定Enum作为String的函数,遍历Enum的所有成员并返回相应的成员。如:
Status getStatusFromString(String statusAsString) {
for (Status element in Status.values) {
if (element.toString() == statusAsString) {
return element;
}
}
return null;
}
所以,序列化:
Status status1 = Status.stopped;
String json = JSON.encode(status1.toString());
print(json) // prints {"Status.stopped"}
反序列化:
String statusAsString = JSON.decode(json);
Status deserializedStatus = getStatusFromString(statusAsString);
print(deserializedStatus) // prints Status.stopped
这是迄今为止我发现的最佳方式。希望这有帮助!