LoganSquare 解析 Android 库:反馈、基准、优点、缺点
LoganSquare parsing Android library : feedback, benchmarks, pros, cons
我正在使用 Jackson 和 DataBind 库来解析 json 并将其映射到 java 对象。我还在其他不太需要 perf 的项目上使用 Gson。
2 月 17 日,LoganSquare 库首次发布,承诺解析速度比 Gson 快 4-10 倍。
- LoganSquare 比 Gson/Jackson 有什么优势?
- 优缺点?
- 你有生产应用程序的基准吗?
- 生产应用程序是否足够稳定?
我知道这可能是一个主要基于意见的问题,所以尽可能技术性和具体性,并根据真实数据回答。
需要明确的是,如果您将应用发布到具有 ART 的设备,您将通过解析获得巨大的速度优势。
所以我将解释到目前为止我使用 logansquare 的经历。
优点:
- 易于使用:对于 Gson,您必须使用 Type 来将 json 数组解析为对象列表,在 loganSquare 中它非常简单
LoganSquare.parseList()
- 更快 : 在任何设备中(自己测试)它都稍微快一些。
- FasterER:在 ART 设备中,它的速度差距确实很大,请参阅他们的基准测试
- RetroFit 友好:是的,它很适合改装。
缺点:
NO REALM DB : 到目前为止,我无法使用 Realm db 运行(我还没有努力尝试)
自定义类型适配器:到目前为止找不到类型适配器或类似的东西,但我不确定。
查看他们的基准 here
这是我糟糕的基准测试结果(这不是一个合适的基准测试,但确实不错):
模拟器 nexus 5,带有 DalvikVM,4.2 jellybean
基准
解析模型
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.google.gson.annotations.SerializedName;
/**
* Created by Ercan on 6/26/2015.
*/
@JsonObject(serializeNullCollectionElements = true ,serializeNullObjects = true)
public class Village {
@SerializedName("IdVillage")
@JsonField(name ="IdVillage")
String tbsVillageId;
@SerializedName("TBS_VillageId")
@JsonField(name ="TBS_VillageId")
String townRefId;
@SerializedName("VillageName")
@JsonField(name ="VillageName")
String villageName;
@SerializedName("Status")
@JsonField(name ="Status")
String status;
@SerializedName("DateInserted")
@JsonField(name ="DateInserted")
String dateInserted;
@SerializedName("DateLastModified")
@JsonField(name ="DateLastModified")
String datelastModified;
public String getTbsVillageId() {
return tbsVillageId;
}
public void setTbsVillageId(String tbsVillageId) {
this.tbsVillageId = tbsVillageId;
}
public String getTownRefId() {
return townRefId;
}
public void setTownRefId(String townRefId) {
this.townRefId = townRefId;
}
public String getVillageName() {
return villageName;
}
public void setVillageName(String villageName) {
this.villageName = villageName;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getDateInserted() {
return dateInserted;
}
public void setDateInserted(String dateInserted) {
this.dateInserted = dateInserted;
}
public String getDatelastModified() {
return datelastModified;
}
public void setDatelastModified(String datelastModified) {
this.datelastModified = datelastModified;
}
}
我的 Nexus 5 设备上有 运行 LoganSquare Benchmark 项目 Android 6.0.1,结果如下:
此外,在使用 lib 一段时间后,我的优缺点如下:
优点
- 解析和序列化都非常快
- 图书馆规模较小
- 列表解析和序列化的简便方法
- 有用的转换器
- 编译时错误,而不是 运行-time only
缺点
- 文档不多,问题和答案也不多
计算器溢出:)
- 支持的类型不多
- 地图集合中仅支持字符串键
我写了一个 example project to see how LoganSquare works and also a blog post,所以请看那里了解更多信息。
response.body()
是字符串 json 响应
// MovieData是一个模型Class
MovieData movieData=LoganSquare.parse(response.body(),MovieData.class);
Log.d("onResponse: ",movieData.getTitle());
图书馆已经 4 年多没有更新了。
到目前为止,它基本上工作正常,但据我所知它将在 gradle 5.
后停止工作
我正在使用 Jackson 和 DataBind 库来解析 json 并将其映射到 java 对象。我还在其他不太需要 perf 的项目上使用 Gson。
2 月 17 日,LoganSquare 库首次发布,承诺解析速度比 Gson 快 4-10 倍。
- LoganSquare 比 Gson/Jackson 有什么优势?
- 优缺点?
- 你有生产应用程序的基准吗?
- 生产应用程序是否足够稳定?
我知道这可能是一个主要基于意见的问题,所以尽可能技术性和具体性,并根据真实数据回答。
需要明确的是,如果您将应用发布到具有 ART 的设备,您将通过解析获得巨大的速度优势。
所以我将解释到目前为止我使用 logansquare 的经历。
优点:
- 易于使用:对于 Gson,您必须使用 Type 来将 json 数组解析为对象列表,在 loganSquare 中它非常简单
LoganSquare.parseList()
- 更快 : 在任何设备中(自己测试)它都稍微快一些。
- FasterER:在 ART 设备中,它的速度差距确实很大,请参阅他们的基准测试
- RetroFit 友好:是的,它很适合改装。
缺点:
NO REALM DB : 到目前为止,我无法使用 Realm db 运行(我还没有努力尝试)
自定义类型适配器:到目前为止找不到类型适配器或类似的东西,但我不确定。
查看他们的基准 here
这是我糟糕的基准测试结果(这不是一个合适的基准测试,但确实不错): 模拟器 nexus 5,带有 DalvikVM,4.2 jellybean
基准
解析模型
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.google.gson.annotations.SerializedName;
/**
* Created by Ercan on 6/26/2015.
*/
@JsonObject(serializeNullCollectionElements = true ,serializeNullObjects = true)
public class Village {
@SerializedName("IdVillage")
@JsonField(name ="IdVillage")
String tbsVillageId;
@SerializedName("TBS_VillageId")
@JsonField(name ="TBS_VillageId")
String townRefId;
@SerializedName("VillageName")
@JsonField(name ="VillageName")
String villageName;
@SerializedName("Status")
@JsonField(name ="Status")
String status;
@SerializedName("DateInserted")
@JsonField(name ="DateInserted")
String dateInserted;
@SerializedName("DateLastModified")
@JsonField(name ="DateLastModified")
String datelastModified;
public String getTbsVillageId() {
return tbsVillageId;
}
public void setTbsVillageId(String tbsVillageId) {
this.tbsVillageId = tbsVillageId;
}
public String getTownRefId() {
return townRefId;
}
public void setTownRefId(String townRefId) {
this.townRefId = townRefId;
}
public String getVillageName() {
return villageName;
}
public void setVillageName(String villageName) {
this.villageName = villageName;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getDateInserted() {
return dateInserted;
}
public void setDateInserted(String dateInserted) {
this.dateInserted = dateInserted;
}
public String getDatelastModified() {
return datelastModified;
}
public void setDatelastModified(String datelastModified) {
this.datelastModified = datelastModified;
}
}
我的 Nexus 5 设备上有 运行 LoganSquare Benchmark 项目 Android 6.0.1,结果如下:
此外,在使用 lib 一段时间后,我的优缺点如下:
优点
- 解析和序列化都非常快
- 图书馆规模较小
- 列表解析和序列化的简便方法
- 有用的转换器
- 编译时错误,而不是 运行-time only
缺点
- 文档不多,问题和答案也不多 计算器溢出:)
- 支持的类型不多
- 地图集合中仅支持字符串键
我写了一个 example project to see how LoganSquare works and also a blog post,所以请看那里了解更多信息。
response.body()
是字符串 json 响应
// MovieData是一个模型Class
MovieData movieData=LoganSquare.parse(response.body(),MovieData.class);
Log.d("onResponse: ",movieData.getTitle());
图书馆已经 4 年多没有更新了。
到目前为止,它基本上工作正常,但据我所知它将在 gradle 5.
后停止工作