在Flutter踩过的序列化的坑
接口交互的时候,特别是希望在返回的数据都有一个固定封装的时候,在.net中我们会去这样实现
public class ResponseInfo<T>
{
public T Data { get; set; }
public bool IsSuccess { get; set; }
public string Msg { get; set; }
public ResponseInfo(bool isSuccess, string msg = "Success")
{
IsSuccess = isSuccess;
Msg = msg;
}
}
这样反序列化的时候也可以直接调用Data来访问具体数据。Dart语言虽然好,但是要想如C#那般简练却是无法(由于我的孤落寡闻,可能不知道存在这样的库,如有,请赐教)。官方教程推荐使用json_serializable来序列化和反序列化一个对象,并且配有代码自动生成,已是非常方便。但是我还是想要C#中的那种简洁和方便,解决这个泛型序列化的问题。
《如何在Fluter上优雅地序列化一个对象》 仅仅让我认识到Dart在序列化上存在痛点,由于帖子提及的层次太高,并不能理解闲鱼提供的是如何一种方案,但是最后的评论中提到了一个built_value,似乎看到了希望,于是埋头研究。终于最后得知确实无法如C#那般泛型的反序列化,并且built_value使用起来比json_serializable更为复杂,它的存在也许不仅仅是解决序列化的问题。其实,json_serializable已经完全满足了接口交互,只是需要比C#多一步,把Data单独拿出来转换成我们需要的类型。这个项目里,有两种序列化方式的使用方式,大家可以对比一下,有什么大家也可以讨论一下。