java 序列化慢_java – GSON序列化非常慢

我试图使用GSON序列化一个7000 POJO阵列,并且序列化时间非常慢.序列化以下对象的数组是3-5秒的顺序:

public class Case {

private Long caseId;

private Key orgKey;

private Key workflowKey;

private Key creatorKey;

private Date creationTimestamp;

private Date lastUpdatedTimestamp;

private String name;

private String stage;

private String notes;

}

关键字段使用自定义序列化器/解串器序列化:

public class GsonKeySerializerDeserializer implements JsonSerializer>,JsonDeserializer>{

@Override

public JsonElement serialize(Key> src,Type typeOfSrc,JsonSerializationContext arg2) {

return new JsonPrimitive(src.getString());

}

@Override

public Key> deserialize(JsonElement src,JsonDeserializationContext arg2) throws JsonParseException {

if (src.isJsonNull() || src.getAsString().isEmpty()) {

return null;

}

String s = src.getAsString();

com.google.appengine.api.datastore.Key k = KeyFactory.stringToKey(s);

return new Key(k);

}

}

为了测试性能,手工编写一个JSON序列化程序,我测试了以下代码,它可以将相同的Case对象数组序列化大约比GSON快10倍.

List cases = (List) retVal;

JSONArray a = new JSONArray();

for (Case c : cases) {

JSONObject o = new JSONObject();

o.put("caseId",c.getCaseId());

o.put("orgKey",c.getOrgKey().getString());

o.put("workflowKey",c.getWorkflowKey().getString());

o.put("creatorKey",c.getCreatorKey().getString());

o.put("creationTimestamp",c.getCreationTimestamp().getTime());

o.put("lastUpdatedTimestamp",c.getLastUpdatedTimestamp().getTime());

o.put("name",c.getName());

o.put("stage",c.getStage());

o.put("notes",c.getNotes());

a.put(o);

}

String json = a.toString();

为什么GSON在这种情况下表现如此糟糕?

UPDATE

以下是实际启动序列化的代码:

Object retVal = someFunctionThatReturnsAList();

String json = g.toJson(retVal);

resp.getWriter().print(json);

UPDATE2

这是一个非常简单的测试用例,说明了相对于org.json的性能不佳:

List list = new ArrayList();

for (int i = 0; i < 7001; i++) {

Foo f = new Foo();

f.id = new Long(i);

list.add(f);

}

Gson gs = new Gson();

long start = System.currentTimeMillis();

String s = gs.toJson(list);

System.out.println("Serialization time using Gson: " + ((double) (System.currentTimeMillis() - start) / 1000));

start = System.currentTimeMillis();

JSONArray a = new JSONArray();

for (Foo f : list) {

JSONObject o = new JSONObject();

o.put("id",f.id);

a.put(o);

}

String json = a.toString();

System.out.println("Serialization time using org.json: " + ((double) (System.currentTimeMillis() - start) / 1000));

System.out.println(json.equals(s));

Foo在哪里

public class Foo {

public Long id;

}

Serialization time using Gson: 0.233

Serialization time using org.json: 0.028

true

几乎10倍的性能差异!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的JSON序列化和反序列化是将Java对象转换为JSON格式的字符串,或将JSON格式的字符串转换为Java对象的过程。 在Java中,可以使用各种库来进行JSON序列化和反序列化,比较常用的有以下几种: 1. Jackson:Jackson是一个功能强大且广泛使用的JSON处理库,它提供了一系列的API来实现JSON与Java对象之间的转换。通过Jackson,可以将Java对象转换为JSON字符串,或将JSON字符串转换为Java对象。 2. GsonGson是Google提供的一个简单易用的JSON处理库,它可以将Java对象转换为JSON字符串,或将JSON字符串转换为Java对象Gson提供了一些简单的API来实现序列化和反序列化操作。 3. Fastjson:Fastjson是阿里巴巴开源的一个高性能的JSON处理库,它支持将Java对象转换为JSON字符串,或将JSON字符串转换为Java对象。Fastjson提供了一些灵活的API来实现序列化和反序列化操作。 这些库都提供了类似的API,可以根据具体需求选择适合的库进行使用。一般来说,使用这些库进行JSON序列化和反序列化的步骤如下: 1. 创建一个Java对象,并设置相应的属性值。 2. 使用JSON处理库的API将Java对象转换为JSON字符串,或将JSON字符串转换为Java对象。 下面是一个使用Jackson库进行JSON序列化和反序列化的示例代码: ```java import com.fasterxml.jackson.databind.ObjectMapper; public class JsonSerializationExample { public static void main(String[] args) throws Exception { // 创建一个Java对象 Person person = new Person("John", 25); // 创建ObjectMapper对象 ObjectMapper objectMapper = new ObjectMapper(); // 将Java对象转换为JSON字符串 String jsonString = objectMapper.writeValueAsString(person); System.out.println("JSON String: " + jsonString); // 将JSON字符串转换为Java对象 Person deserializedPerson = objectMapper.readValue(jsonString, Person.class); System.out.println("Deserialized Person: " + deserializedPerson); } } class Person { private String name; private int age; public Person() {} public Person(String name, int age) { this.name = name; this.age = age; } // 省略getter和setter方法 @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } } ``` 这个示例中,首先创建了一个Person对象,然后使用ObjectMapper将Person对象转换为JSON字符串,并输出结果。接着,将JSON字符串转换为Java对象,并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值