gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:10:59 24 4
gpt4 key购买 nike

我想使用 Dart 的新(实验性)enum功能而不是使用静态常量字符串堆栈,但序列化/反序列化的最佳方法是什么enum使用 JSON 的变量?我已经让它以这种方式工作,但肯定有更好的解决方案:

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

如果您使用索引进行序列化,您可能会被锁定以将您的枚举永远保持在相同的顺序,所以我更喜欢使用某种字符串形式。有人想出这个吗?

最佳答案

正如之前建议的答案之一,如果您在客户端和服务器上共享相同的实现,那么序列化名称是我认为最好的方法并尊重 S.O.L.I.D design 中的开放/关闭原则。 , 说明:

"software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification"



如果您需要向 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

这是我目前找到的最好的方法。希望这有帮助!

关于json - 使用 JSON 序列化/反序列化 Dart 的新枚举的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27236629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com