Memcached中对象反序列化和json字符串用jackson解析成对象的比较

如果项目已经发布,如果临时想对某个在Memcached中的key修改值,那么以对象形式存储的话,将很难修改,但如果以字符串形式存储,通过json解析成对象的话,则会方便很多,因为通过界面往Memcached 添加字符串值是很简单的。

现在来比较一下这两种方式在时间消耗方面的差异:

package bean;
import java.io.Serializable;
public class User implements Serializable{

    /**
     * 序列号
     */
    private static final long serialVersionUID = -3896605600471191953L;
    private int uid;
    private String uname;
    private String upass;
    private String abc;

    public String getAbc() {
        return abc;
    }
    public void setAbc(String abc) {
        this.abc = abc;
    }
    public int getUid() {
       return uid;
    }
    public void setUid(int uid) {
       this.uid = uid;
    }
    public String getUname() {
       return uname;
    }
    public void setUname(String uname) {
       this.uname = uname;
    }
    public String getUpass() {
       return upass;
    }
    public void setUpass(String upass) {
       this.upass = upass;
    }

}

(1)单个Object

把对象和json字符串放入memcached:

 User user = new User();
        user.setUid(123);
        user.setUname("Kingson_Wu");
        user.setUpass("VIPS");
        user.setAbc("acvb");

        cache.set("Kingson_object", user);

        // Convert object to JSON string
        String Json = mapper.writeValueAsString(user);
        System.out.println("Change Object to JSON String: " + Json);
        //cache.set("Kingson_json", Json);
        cache.set("Kingson_json", " {\"uid\":123, \"uname\":\"Kingson_Wu\",\"upass\":\"VIPS\",\"abc\":\"acvb\"}    ");

分别从memcached取出对象和json字符串进行转化:

 ObjectMapper mapper = new ObjectMapper();
        long start1 = System.nanoTime();

        User userObject = (User) cache.get("Kingson_object");

       // System.out.println(userObject.getUid() + userObject.getUname() + userObject.getUpass());
        long end1 = System.nanoTime();
        System.out.println("time1:" + (end1 - start1));

        long start2 = System.nanoTime();

        User userJson = (User) mapper.readValue((String) cache.get("Kingson_json"), User.class);
       // System.out.println(userJson.getUid() + userJson.getUname() + userJson.getUpass());

        long end2 = System.nanoTime();
        System.out.println("time2:" + (end2 - start2));

结果:

123Kingson_WuVIPS

time1:14086635

123Kingson_WuVIPS

time2:39176438

(2)List对象

把对象和json字符串放入memcached:

List<User> list=new ArrayList<>();
        list.add(user);
        list.add(user);
        cache.set("list_Object", list);

        String JsonList = mapper.writeValueAsString(list);
        cache.set("list_json", JsonList);
        System.out.println(JsonList);

分别从memcached取出对象和json字符串进行转化:

long s1 = System.nanoTime();
        List<User> list_Object= (List<User>)cache.get("list_Object");
        //System.out.println(list_Object.size());
        long e1 = System.nanoTime();
        System.out.println("time1:" + (e1 - s1));

        long s2 = System.nanoTime();
        JavaType javaType = getCollectionType(ArrayList.class, User.class);
        List<User> list_json =  (List<User>)mapper.readValue((String)cache.get("list_json"), javaType);
        //System.out.println(list_json.size());
        long e2 = System.nanoTime();
        System.out.println("time2:" + (e2 - s2));
  public static JavaType getCollectionType(Class<?> collectionClass, Class<?>... elementClasses) {

        ObjectMapper mapper = new ObjectMapper();
                 return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
             }

结果:

time1:1885873

time2:7717003

可以看出json字符串转化的时间是对象反序列化的三倍,但是json字符串转化的方式对于扩展来说比较灵活,至于使用哪种方式,看实际需求选择。

时间: 2024-10-13 11:17:39

Memcached中对象反序列化和json字符串用jackson解析成对象的比较的相关文章

C# Winform反序列化复杂json字符串

最近接的私单是一个CS项目,里面所有的操作都是通过调用API接口来进行的. 接口详细说明 协议:https  请求方式:post  https://xx.xxx.net/app/clients 提交json 数据包 { "action":" food_t_list", "data":{ “pageIndex”:”1”, “pageSize”:”20”, “foodGId”:”1”, “storeId”:”1” } } 返回说明 正确时返回JSON

JS对象转化为JSON字符串

js方法: JSON.stringify 把一个对象转换成json字符串 JSON.parse 把一个json字符串解析成对象. JQ方法: 用jquery的方法 $.parseJSON(jsonString) 在官网下载一个json2.js 然json.parse()方法 这个方法firefox chrome是直接支持的 ie需要引入json2.js

如何将C#对象转化为JSON字符串

System.Web.Extensions.dll中类JavaScriptSerializer可以帮助我们把C#对象转化为JSON字符串. 有一个Person类 1 public class Person 2 { 3 private string name; 4 5 public string Name 6 { 7 get { return name; } 8 set { name = value; } 9 } 10 private int age; 11 12 public int Age 1

java对象转化为json字符串

java对象转化为json字符串,关键代码如下: JSONObject json = JSONObject.fromObject(person); String resultStr = json.toString(); 转化后的字符串形如: {"age":"18","name":"天津犀利妞","password":"123456","sex":"女&quo

RestTemplate传输值为null的属性、利用FastJson将属性中有空值null的对象转化成Json字符串

一个pojo类: import lombok.Data; @Data public class Friend { private String name; private int age; private String sex; } 初始化一个Friend对象,该对象属性为"sex"对应的值设置为null: public class FriendTest { private Friend friend = new Friend(); @Before public void init()

SpringBoot 返回json 字符串(jackson 及 fast json)

一.jackson 1.Controller 类加注解@RestController 这个注解相当于@Controller 这个注解加 @ResponseBody 2.springBoot 默认使用 jackson 来把java 对象转化为json 字符串. 二.fast json 1.pom 文件加入fast json 依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson&l

C#将对象序列化成JSON字符串

public string GetJsonString() { List<Product> products = new List<Product>(){ new Product(){Name="苹果",Price=5.5}, new Product(){Name="橘子",Price=2.5}, new Product(){Name="干柿子",Price=16.00} }; ProductList productlis

IE8中页面接收后台json字符串乱码问题

今天碰到一个IE8的乱码问题,在后台我用jsonObject对字符串数组进行了转化,在页面中接收到的不是json字符串数组了,而是中文乱码,在ie的后续版本中,以及谷歌中都是没有问题的,很奇怪,,debug了一下,发现前台页面js中一接收到后台的字符串就是乱码,查了很多资料,说是ie8内置的stringify和parse方法,自动对utf8进行了编码,也试了很多种,包括引入json2(可能是我没有引成功把),最后的解决方案是在后台设置页面的编码方式,response.setContentType

json字符串反序列化成匿名类型对象

添加第三方引用 using Newtonsoft.Json; /// <summary> /// 匿名类型解析 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="jsonString"></param> /// <param name="anonymousTypeObject">