【发布时间】:2014-03-26 13:50:07
【问题描述】:
我已经阅读了大量讨论 GSON 性能的主题,如果您担心性能,许多人建议使用流式传输。不过,似乎没有人遇到像我这样的性能问题。
这是我初始化 GSON 对象的方式:
gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
这是我正在执行的.toJson() 语句,它是我即将展示的基准测试结果中的唯一语句:
String resultString = gson.toJson(results.get(0));
... 其中results.get(0) 计算为包含1499 个PrblFldr 对象的List<PrblFldr> 对象(我将展示稍后序列化的非原始类)。以下是我临时基准测试的结果:
INFO: Starting: GSON CONVERSION
INFO: Finished: GSON CONVERSION --- Time: 161705 ms
最后,这是我要序列化的类。我只显示带有@Expose 注释的那些,因为这些是唯一应该序列化的字段。
PrblFldr:
public class PrblFldr implements Serializable {
@Expose
@SerializedName("name")
@Column(name="FLDR_NM")
private String fldrNm;
@Expose
@SerializedName("template")
@ManyToOne
@JoinColumn(name="FLDR_TYP_SEQ_ID", insertable=false, updatable=false)
private PrblTmplt prblTmplt;
@Expose
@SerializedName("attributes")
@OneToMany(mappedBy="prblFldr")
private List<PrblFldrAtrbtVal> prblFldrAtrbtVals;
// other fields omitted...
}
PrblTmplt:
public class PrblTmplt implements Serializable {
@Expose
@SerializedName("id")
@Id
@Column(name="TMPLT_SEQ_ID")
private long tmpltSeqId;
@Expose
@SerializedName("name")
@Column(name="TMPLT_NM")
private String tmpltNm;
// other fields omitted...
}
PrblFldrAtrbtVal:
public class PrblFldrAtrbtVal implements Serializable {
@Expose
@SerializedName("id")
@Id
@Column(name="FLDR_ATRBT_VAL_SEQ_ID")
private long fldrAtrbtValSeqId;
@Expose
@SerializedName("val")
@Column(name="FLDR_ATRBT_VAL")
private String fldrAtrbtVal;
@Expose
@SerializedName("attributeTemplate")
@ManyToOne
@JoinColumn(name="FLDR_ATRBT_SEQ_ID")
private PrblTmpltAtrbt prblTmpltAtrbt;
// other fields omitted...
}
最后,PrblTmpltAtrbt:
public class PrblTmpltAtrbt implements Serializable {
@Expose
@SerializedName("id")
@Id
@Column(name="TMPLT_ATRBT_SEQ_ID")
private long tmpltAtrbtSeqId;
@Expose
@SerializedName("name")
@Column(name="TMPLT_ATRBT_LBL_NM")
private String tmpltAtrbtLblNm;
@Expose
@SerializedName("required")
@Column(name="TMPLT_ATRBT_RQRD_IND")
private String tmpltAtrbtRqrdInd;
// other fields omitted...
}
如您所见,一切都分解为 long 或 String 对象。尽管这里进行了 4 层对象序列化,但我仍然认为我不应该看到如此长的序列化时间。此外,您可能已经注意到,我使用的是 EclipseLink JPA(因此有 @Id 和 @Column 注释)。这可能是问题的根源吗?
问题:是什么导致了如此长的序列化时间?
编辑:还可能值得注意的是,PrblFldr 类中的 List<PrblFlderAtrbtVal> prblFldrAtrbtVals 字段的平均大小可能为 5 或 6,最大为 15 左右。 p>
【问题讨论】:
-
您不太可能正确/准确地测量它,但是是的; Gson并不是特别快。如果你想快速使用杰克逊。 github.com/eishay/jvm-serializers/wiki
-
但考虑到 this topic 谈到 GSON 需要 3-5 秒处理 7000 个 POJO,我很困惑为什么这需要很长时间。
-
Gson 的哪个版本?
-
我使用的是 GSON 2.2.4。
标签: json jpa serialization eclipselink gson