序列化反序列化

来源:互联网 发布:mac 删除文件夹命令 编辑:程序博客网 时间:2024/04/29 04:04

编写反序列化Adapter

[java] view plaincopyprint?
  1. import com.google.gson.*;
  2. import com.google.gson.JsonDeserializer;
  3. import java.lang.reflect.Type;
  4. import java.math.BigDecimal;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. /**
  8. * Created by IntelliJ IDEA.
  9. * User: chuang.liu
  10. * Date: 11-7-22
  11. * Time: 上午10:24
  12. * To change this template use File | Settings | File Templates.
  13. */
  14. publicclass NaturalDeserializerimplements JsonDeserializer<Object> {
  15. public Object deserialize(JsonElement json, Type typeOfT,
  16. JsonDeserializationContext context) {
  17. if(json.isJsonNull())returnnull;
  18. elseif(json.isJsonPrimitive())return handlePrimitive(json.getAsJsonPrimitive());
  19. elseif(json.isJsonArray())return handleArray(json.getAsJsonArray(), context);
  20. elsereturn handleObject(json.getAsJsonObject(), context);
  21. }
  22. private Object handlePrimitive(JsonPrimitive json) {
  23. if(json.isBoolean())
  24. return json.getAsBoolean();
  25. elseif(json.isString())
  26. return json.getAsString();
  27. else {
  28. BigDecimal bigDec = json.getAsBigDecimal();
  29. // Find out if it is an int type
  30. try {
  31. bigDec.toBigIntegerExact();
  32. try {return bigDec.intValueExact(); }
  33. catch(ArithmeticException e) {}
  34. return bigDec.longValue();
  35. } catch(ArithmeticException e) {}
  36. // Just return it as a double
  37. return bigDec.doubleValue();
  38. }
  39. }
  40. private Object handleArray(JsonArray json, JsonDeserializationContext context) {
  41. Object[] array = new Object[json.size()];
  42. for(int i =0; i < array.length; i++)
  43. array[i] = context.deserialize(json.get(i), Object.class);
  44. return array;
  45. }
  46. private Object handleObject(JsonObject json, JsonDeserializationContext context) {
  47. Map<String, Object> map = new HashMap<String, Object>();
  48. for(Map.Entry<String, JsonElement> entry : json.entrySet())
  49. map.put(entry.getKey(), context.deserialize(entry.getValue(), Object.class));
  50. return map;
  51. }
  52. }
[java] view plaincopyprint?
[java] view plaincopyprint?
  1. 在test类中调用测试下
[java] view plaincopyprint?
  1. <pre class="java" name="code"></pre><preclass="java" name="code">import com.dev.core.user.model.User;
  2. import com.google.gson.*;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. /**
  6. * Created by IntelliJ IDEA.
  7. * User: chuang.liu
  8. * Date: 11-7-21
  9. * Time: 下午3:50
  10. * To change this template use File | Settings | File Templates.
  11. */
  12. publicclass test {
  13. privateint data;
  14. private Map<String,Object> mapData;
  15. publicvoid setData(int data){
  16. this.data =data;
  17. }
  18. publicint getData(){
  19. return data;
  20. }
  21. publicvoid setmapData(Map<String,Object> data){
  22. this.mapData =data;
  23. }
  24. public Map<String,Object> getmapData(){
  25. return mapData;
  26. }
  27. publicstaticvoid main(String arg[]){
  28. GsonBuilder gsonBuilder = new GsonBuilder();
  29. gsonBuilder.registerTypeAdapter(Object.class,new NaturalDeserializer());
  30. Gson gson = gsonBuilder.create();
  31. Map<String, Object> data = new HashMap<String, Object>();
  32. data.put("user",new User());
  33. data.put("url","http:///sina/verify?code=");
  34. test t =new test();
  35. t.setData(10);
  36. t.setmapData(data);
  37. String jstring = gson.toJson(t);
  38. test nt = gson.fromJson(jstring,test.class);
  39. System.out.println("done");
  40. }
  41. }
  42. </pre><br><br>