摘要:使用實現通用的序列化和反序列化核心通過方法設置即使使用作為也可以實現相應類型的序列化和反序列化好處只定義一個序列化器就可以了通用引入代碼直接使用設置了的直接使用的反序列化,需要給定序列化的類使用設置了的來反序列化,可以使用達到想要的效果
Jackson 使用 defaultTyping 實現通用的序列化和反序列化 核心
private ObjectMapper createObjectMapping() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); return objectMapper; }
通過 objectMapper.enableDefaultTyping() 方法設置
即使使用 Object.class 作為 jcom.fasterxml.jackson.databind.JavaType 也可以實現相應類型的序列化和反序列化
好處:只定義一個序列化器就可以了(通用)
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); } /** 設置了 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()); } /** 使用設置了 DefaultTyping 的 ObjectMapping 來反序列化,可以使用 Object 達到想要的效果 **/ @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 + """ + "}"; } } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67191.html
摘要:優點是反序列化時不需要提供類型信息,但缺點是序列化后的結果非常龐大,是格式的倍左右,這樣就會消耗服務器的大量內存。使用庫將對象序列化為字符串。優點是速度快,序列化后的字符串短小精悍。 需要的jar包:spring版本:4.3.6.RELEASE,jedis版本:2.9.0,spring-data-redis:1.8.0.RELEASE;如果使用jackson序列化的話還額外需要:jac...
摘要:開發應用程序非常適合應用程序開發,通過使用嵌入式或,你可以創建一個自包含的服務器。如果你還沒有開發過一個應用程序,你可以按照入門部分中的示例進行操作。自動配置為大多數應用程序提供了良好的自動配置。 27. 開發Web應用程序 Spring Boot非常適合web應用程序開發,通過使用嵌入式Tomcat、Jetty、Undertow或Netty,你可以創建一個自包含的HTTP服務器。大多...
摘要:本文有部分代碼是抄襲的。第二個坑需要指定對象的數據類型,不然反序列化報錯。第三的編輯器非常不好用。上面的配置有個缺陷,就是只能指定數據類型去緩存到。其實還可以配置一個但我持久層是。查詢分頁結果時,會無法反序列化。搜了半天沒解決方案。 本文有部分代碼是抄襲的。 1 :引入依賴 org.springframework.data spring-data-redis ${spr...
摘要:一在文件中引入二配置地址等配置數據庫索引默認為服務器地址服務器連接端口服務器連接密碼默認為空連接池最大連接數使用負值表示沒有限制連接池最大阻塞等待時間使用負值表示沒有限制連接池中的最大空閑連接連接池中的最小空閑連接連接超時時 一、在pom文件中引入redis org.springframework.boot spring-boot-starter-redis ...
閱讀 1762·2021-10-12 10:12
閱讀 2530·2021-09-29 09:42
閱讀 2711·2021-09-03 10:28
閱讀 2249·2019-08-30 15:54
閱讀 1153·2019-08-30 15:53
閱讀 1388·2019-08-30 11:26
閱讀 3357·2019-08-30 11:02
閱讀 2134·2019-08-30 11:02