使用JSON序列化/反序列化Dart的新枚举的最佳方法是什么?

时间:2014-12-01 20:24:02

标签: json enums dart

我想使用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形式。有人想出来了吗?

1 个答案:

答案 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

这是迄今为止我发现的最佳方式。希望这有帮助!