我写这个答案只是为了表示类内序列化比使用第三方序列化库(如 Jackson)要快得多。
对于快速序列化,尤其是在分布式计算和繁重的跨应用程序通信的情况下,为此目的开发接口或基类在性能方面是明智的。这将与以下代码相似,但不一定相同:
public abstract class JsonCompatible {
public abstract String jasonSerialize();
public abstract void jasonDeserialize(String obj);
protected String[] breakAsJson(String obj){
return obj.substring(1, obj.length()-2).replace("\"", "").split(",");
}
}
要序列化的数据模型或类可以实现接口或示例抽象类。为了同时解决提问者的问题并提供解决方案,我为Industry 类开发了一个示例。
public class Industry extends JsonCompatible {
private String id, description;
private int code;
public Industry(String id, String description, int code) {
this.id = id;
this.description = description;
this.code = code;
}
public Industry(String id, String description, String code) {
this.id = id;
this.description = description;
this.code = Integer.parseInt(code);
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public void setCode(String code) {
this.code = Integer.parseInt(code);
}
public Industry() {
}
@Override
public String jasonSerialize() {
return String.format("{\"Id\":\"%s\", \"Code\":\"%d\", \"Description\":\"%s\"}", id, code, description);
}
@Override
public void jasonDeserialize(String obj) {
for(String i : breakAsJson(obj)){
String[] expand = i.split(":");
if(expand.length > 1){
expand[0] = expand[0].trim();
if(expand[0].equals("Id")){
id = expand[1];
}
else if (expand[0].equals("Code")){
setCode(expand[1]);
}
else if(expand[0].equals("Description")){
description = expand[1];
}
}
}
}
}
如示例代码所示,Industry 类派生自 JsonCopatible。此时,我们可以开发一个数组序列化器来序列化Industry 对象的集合,并且序列化它比Jackson 执行的速度快得多,如下所示。
public class JsonArray<T extends JsonCompatible> {
private List<T> obj;
private String namespace = "Default";
public JsonArray(List<T> obj) {
this.obj = obj;
}
public JsonArray(List<T> obj, String namespace) {
this.obj = obj;
this.namespace = namespace;
}
public String getJasonArray(){
StringBuilder sb = new StringBuilder();
sb.append("{\"").append(namespace).append("\": [");
List<String> elements = obj.stream().map(x-> x.jasonSerialize()).collect(Collectors.toList());
int size = elements.size();
for(int i = 0; i < size; i++){
sb.append(elements.get(i));
if(i < size - 1){
sb.append(",");
}
}
sb.append("]}");
return sb.toString();
}
}
很明显,这只是这种方法的一个例子,它必须根据项目/询问者的需要和要求进行定制。由于数组序列化以通用方式工作,因此不会涉及任何冗余代码,并且由于这不依赖于反射(Jackson 所依赖的),因此效率更高。