曾经有个项目,遇到一个情况就是DTO需要“频繁”的转成JsonObject进行传递(因为用的框架是 Vert.x,用EventBus通信)存在明显的性能消耗。或者使用框架带的DTO自定义,但是一看就没麻烦就没有操作。
需要频繁的操作如下:
JSONObject jo= (JSONObject) JSONObject.toJSON(fooBean);
FooBean fooBean= (FooBean)JSONObject.toBean(jo, FooBean.class);
为了提高性能,做的就是改造DTO,思路如下:
本来DTO的属性是本来是以全局变量存在各自的类中,现在把这类全部去掉,改成维护在JsonObject 中。因为操作相同,把所有的DTO都改成继承同一个基础的DTO ,在基础的DTO中统一维护。
1.为了适配其他框架的实例化,还是要保留相应的get/set,但是get/set操作的其实是JsonObject
2.为了非String类型的数据,做相关方法的改写。
//-----------BaseJsonDTO .java-----
public class BaseJsonDTO {
private static Logger logger = LoggerFactory.getLogger(RespGenerator.class);
private static DateTimeFormatter standDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
private static DateTimeFormatter standDateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@JsonIgnore
protected JsonObject jsonObject;
public BaseJsonDTO() {
jsonObject = new JsonObject();
}
public BaseJsonDTO(JsonObject jsonObject) {
this.jsonObject = jsonObject;
}
public JsonObject getJsonObject() {
return jsonObject;
}
public void setJsonObject(JsonObject jsonObject) {
this.jsonObject = jsonObject;
}
/***
* @Description
* @Params 日期操作
* @Returns java.time.LocalDateTime
*/
public LocalDateTime parseLocalDateTime(String key) {
return StringUtils.isEmpty(this.jsonObject.getString(key)) ? null : LocalDateTime.parse(this.jsonObject.getString(key), standDateTimeFormatter);
}
/***
* @Description
* @Params 日期操作2 没有时分秒
* @Returns java.time.LocalDate
*/
public LocalDate parseLocalDate(String key) {
return StringUtils.isEmpty(this.jsonObject.getString(key)) ? null : LocalDate.parse(this.jsonObject.getString(key), standDateFormatter);
}
/***
* @Description
* @Params 日期操作
* @Returns java.time.LocalDateTime
*/
public void putLocalDateTime(String key, LocalDateTime localDateTime) {
this.jsonObject.put(key, localDateTime == null ? null : localDateTime.format(standDateTimeFormatter));
}
/***
* @Description
* @Params 日期操作2 没有时分秒
* @Returns java.time.LocalDate
*/
public void putLocalDate(String key, LocalDate localDate) {
this.jsonObject.put(key, localDate == null ? null : localDate.format(standDateFormatter));
}
public static <T extends BaseJsonDTO> JsonArray parseList(List<T> list) {
if (list == null) {
return null;
}
JsonArray jsonArray = new JsonArray();
for (T t : list) {
jsonArray.add(t.getJsonObject());
}
return jsonArray;
}
public static <T extends BaseJsonDTO> List parseJsonArray(JsonArray jsonArray, Class<T> objectClass) {
if (jsonArray == null) {
return new ArrayList();
}
List<T> result = new ArrayList<>();
for (Iterator iter = jsonArray.iterator(); iter.hasNext(); ) {
JsonObject jsonObject = (JsonObject) iter.next();
T t = null;
try {
t = objectClass.newInstance();
} catch (InstantiationException e) {
logger.error("", e);
} catch (IllegalAccessException e) {
logger.error("", e);
}
t.setJsonObject(jsonObject);
result.add(t);
}
return result;
}
}
//-----------CallNumDTO.java-----
public class CallNumDTO extends BaseJsonDTO {
public CallNumDTO() {
super();
}
public CallNumDTO(JsonObject jsonObject) {
super(jsonObject);
}
public static final String _APPID = "appId";
public static final String _NUMS= "nums";
public static final String _PRODUCTNAME = "productName";
public static final String _PRIVACY = "privacy";
public String getAppId() {
return this.jsonObject.getString(_APPID);
}
public void setAppId(String appId) {
this.jsonObject.put(_APPID,appId);
}
public List<String> getNums() {
return this.jsonObject.getJsonArray(_NUMS).getList();
}
public void setNums(List<String> nums) {
this.jsonObject.put(_NUMS, new JsonArray(nums));
}
public String getProductName() {
return this.jsonObject.getString(_PRODUCTNAME);
}
public void setProductName(String productName) {
this.jsonObject.put(_PRODUCTNAME,productName);
}
public String getPrivacy() {
return this.jsonObject.getString(_PRIVACY);
}
public void setPrivacy(String privacy) {
this.jsonObject.put(_PRIVACY,privacy);
}
}
来源:oschina
链接:https://my.oschina.net/u/2382040/blog/3219487