摘要:使用實(shí)現(xiàn)通用的序列化和反序列化核心通過方法設(shè)置即使使用作為也可以實(shí)現(xiàn)相應(yīng)類型的序列化和反序列化好處只定義一個(gè)序列化器就可以了通用引入代碼直接使用設(shè)置了的直接使用的反序列化,需要給定序列化的類使用設(shè)置了的來反序列化,可以使用達(dá)到想要的效果
Jackson 使用 defaultTyping 實(shí)現(xiàn)通用的序列化和反序列化 核心
private ObjectMapper createObjectMapping() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); return objectMapper; }
通過 objectMapper.enableDefaultTyping() 方法設(shè)置
即使使用 Object.class 作為 jcom.fasterxml.jackson.databind.JavaType 也可以實(shí)現(xiàn)相應(yīng)類型的序列化和反序列化
好處:只定義一個(gè)序列化器就可以了(通用)
maven 引入代碼com.fasterxml.jackson.core jackson-databind 2.4.1.3 junit junit 4.12 test
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.TypeFactory; import org.junit.Assert; import org.junit.Test; import java.io.IOException; import java.io.Serializable; /** * Created by sealde on 6/7/17. */ public class SerializerTest { private static final String userString = "{"id":null,"username":"admin","password":"admin"}"; private static final String userStringWithDefaultType = "["com.seal_de.domain.UserInfo",{"id":null,"username":"admin","password":"admin"}]"; /** 直接使用 ObjectMapping **/ @Test public void serialize() throws JsonProcessingException { CustomSerializer serializer = new CustomSerializer(Object.class); String s = serializer.serialize(createUser()); Assert.assertEquals(s, userString); } /** 設(shè)置了 DefaultTyping 的 ObjectMapper **/ @Test public void serializeWithDefaultType() throws JsonProcessingException { CustomSerializer serializer = new CustomSerializer(Object.class); serializer.setObjectMapper(createObjectMapping()); String s = serializer.serialize(createUser()); Assert.assertEquals(s, userStringWithDefaultType); } /** 直接使用 ObjectMapping 的反序列化,需要給定序列化的類 **/ @Test public void deserialize() throws IOException { CustomSerializerserializer = new CustomSerializer(UserInfo.class); UserInfo userInfo = serializer.deserialize(userString); System.out.println(userInfo); Assert.assertEquals(userInfo, createUser()); } /** 使用設(shè)置了 DefaultTyping 的 ObjectMapping 來反序列化,可以使用 Object 達(dá)到想要的效果 **/ @Test public void deserializeWithDefaultTyping() throws IOException { CustomSerializer serializer = new CustomSerializer(Object.class); serializer.setObjectMapper(createObjectMapping()); UserInfo userInfo = (UserInfo) serializer.deserialize(userStringWithDefaultType); System.out.println(userInfo); Assert.assertEquals(userInfo, createUser()); } private ObjectMapper createObjectMapping() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); return objectMapper; } private UserInfo createUser() { UserInfo userInfo = new UserInfo(); userInfo.setUsername("admin"); userInfo.setPassword("admin"); return userInfo; } private class CustomSerializer { private final JavaType javaType; private ObjectMapper objectMapper = new ObjectMapper(); public CustomSerializer(JavaType javaType) { this.javaType = javaType; } public CustomSerializer(Class clazz) { this.javaType = TypeFactory.defaultInstance().constructType(clazz); } public void setObjectMapper(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } public String serialize(Object o) throws JsonProcessingException { return this.objectMapper.writeValueAsString(o); } public T deserialize(String s) throws IOException { return this.objectMapper.readValue(s, this.javaType); } } private class UserInfo implements Serializable { private static final long serialVersionUID = 1L; private String id; private String username; private String password; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; UserInfo userInfo = (UserInfo) o; if (id != null ? !id.equals(userInfo.id) : userInfo.id != null) return false; if (username != null ? !username.equals(userInfo.username) : userInfo.username != null) return false; if (password != null ? !password.equals(userInfo.password) : userInfo.password != null) return false; return true; } @Override public int hashCode() { int result = id != null ? id.hashCode() : 0; result = 31 * result + (username != null ? username.hashCode() : 0); result = 31 * result + (password != null ? password.hashCode() : 0); return result; } @Override public String toString() { return "UserInfo{" + "id="" + id + """ + ", username="" + username + """ + ", password="" + password + """ + "}"; } } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67191.html
摘要:優(yōu)點(diǎn)是反序列化時(shí)不需要提供類型信息,但缺點(diǎn)是序列化后的結(jié)果非常龐大,是格式的倍左右,這樣就會消耗服務(wù)器的大量內(nèi)存。使用庫將對象序列化為字符串。優(yōu)點(diǎn)是速度快,序列化后的字符串短小精悍。 需要的jar包:spring版本:4.3.6.RELEASE,jedis版本:2.9.0,spring-data-redis:1.8.0.RELEASE;如果使用jackson序列化的話還額外需要:jac...
摘要:開發(fā)應(yīng)用程序非常適合應(yīng)用程序開發(fā),通過使用嵌入式或,你可以創(chuàng)建一個(gè)自包含的服務(wù)器。如果你還沒有開發(fā)過一個(gè)應(yīng)用程序,你可以按照入門部分中的示例進(jìn)行操作。自動(dòng)配置為大多數(shù)應(yīng)用程序提供了良好的自動(dòng)配置。 27. 開發(fā)Web應(yīng)用程序 Spring Boot非常適合web應(yīng)用程序開發(fā),通過使用嵌入式Tomcat、Jetty、Undertow或Netty,你可以創(chuàng)建一個(gè)自包含的HTTP服務(wù)器。大多...
摘要:本文有部分代碼是抄襲的。第二個(gè)坑需要指定對象的數(shù)據(jù)類型,不然反序列化報(bào)錯(cuò)。第三的編輯器非常不好用。上面的配置有個(gè)缺陷,就是只能指定數(shù)據(jù)類型去緩存到。其實(shí)還可以配置一個(gè)但我持久層是。查詢分頁結(jié)果時(shí),會無法反序列化。搜了半天沒解決方案。 本文有部分代碼是抄襲的。 1 :引入依賴 org.springframework.data spring-data-redis ${spr...
摘要:一在文件中引入二配置地址等配置數(shù)據(jù)庫索引默認(rèn)為服務(wù)器地址服務(wù)器連接端口服務(wù)器連接密碼默認(rèn)為空連接池最大連接數(shù)使用負(fù)值表示沒有限制連接池最大阻塞等待時(shí)間使用負(fù)值表示沒有限制連接池中的最大空閑連接連接池中的最小空閑連接連接超時(shí)時(shí) 一、在pom文件中引入redis org.springframework.boot spring-boot-starter-redis ...
閱讀 1801·2021-10-12 10:12
閱讀 2555·2021-09-29 09:42
閱讀 2733·2021-09-03 10:28
閱讀 2266·2019-08-30 15:54
閱讀 1172·2019-08-30 15:53
閱讀 1402·2019-08-30 11:26
閱讀 3369·2019-08-30 11:02
閱讀 2153·2019-08-30 11:02