使用场景:自己项目对接多个外部系统,各个外部系统使用的字段并没有统一,所以要根据不同系统动态的输出序列化数据,使适应各个系统的要求
实现方式使用自定义注解和fastjson实现需求
fastjson的NameFilter的作用:序列化时,属性名变成自己指定的名称
实现过程自定义注解一:MyParamNamepackage xin.yangshuai.cipher.json;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * MyParamName * * @author shuai * @date 2021/3/23 */@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})public @interface MyParamName {String value() default "";NameEle[] names() default {};}value、names都是非必填
value:默认序列化的名称
names:自定义注解二,数组形式
自定义注解二:NameElepackage xin.yangshuai.cipher.json;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * NameEle * * @author shuai * @date 2021/3/24 */@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})public @interface NameEle {String id();String value();}id:唯一标识,确定序列化后的属性名
value:定义序列化后的属性名
手写MyNameFilter,实现fastjson的NameFilterpackage xin.yangshuai.cipher.json;import com.alibaba.fastjson.serializer.NameFilter;import java.lang.reflect.Field;/** * MyNameFilter * * @author shuai * @date 2021/3/23 */public class MyNameFilter implements NameFilter {private String id;public MyNameFilter() {}public MyNameFilter(String id) {this.id = id;}@Overridepublic String process(Object o, String name, Object value) {try {Field field = o.getClass().getDeclaredField(name);MyParamName myParamName = field.getDeclaredAnnotation(MyParamName.class);NameEle[] nameEles = myParamName.names();String defaultName = myParamName.value();if (nameEles.length == 0 && defaultName.length() > 0) {return defaultName;}for (NameEle n : nameEles) {if (id.equals(n.id())) {return n.value();}}} catch (Exception e) {return name;}return name;}}构造方法传递id属性的值,与自定义注解二的id进行匹配,匹配成功则使用对应的属性名
实体类,属性上添加自定义注解package xin.yangshuai.cipher.json;import com.alibaba.fastjson.JSON;/** * Person * * @author shuai * @date 2021/3/23 */public class Person {@MyParamName(names = {@NameEle(id = "ln", value = "i_d"),@NameEle(id = "jl", value = "_id")})private String id;@MyParamName("NAME")private String name;private String age;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"id='" + id + '\'' +", name='" + name + '\'' +", age='" + age + '\'' +'}';}}运行主方法测试public static void main(String[] args) {Person person = new Person();person.setAge("18");person.setId("001");person.setName("张三");String s = JSON.toJSONString(person, new MyNameFilter("jl"));System.out.println(s);String s1 = JSON.toJSONString(person, new MyNameFilter("ln"));System.out.println(s1);}结果为:
{"age":"18","_id":"001","NAME":"张三"} {"age":"18","i_d":"001","NAME":"张三"}
参考# java序列化对象,根据不同配置动态改变属性名
原文:https://juejin.cn/post/7101517823695912990java序列化对象,根据不同配置动态改变属性名
fastjson的NameFilter的作用:序列化时,属性名变成自己指定的名称 实现过程自定义注解一:MyParamNamepackage xin.yangshuai.cipher.json;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;\/** * M...
java如何实现对象的序列化
1、Java中需要序列化的类必须实现Serializable接口,这是一个空接口;为方便后续反序列化操作更顺畅,需要为这个实体类添加一个有默认值的serialVersionUID成员变量;后续步骤会演示如何将这个实体类对象进行序列化。2、演示将对象序列化并写入到一个本地文件中:首先创建一个类,并声明一个成员方法;通过类...
java如何实现对象的序列化
1. **实现Serializable接口**:首先,确保你的类实现了`Serializable`接口。这是必须的,因为Java的序列化机制会检查类是否实现了该接口。2. **使用ObjectOutputStream序列化**:创建一个`ObjectOutputStream`实例,该实例将对象写入到一个`OutputStream`中(比如文件、网络连接等)。然后,调用`writeObject...
为什么java对象不能直接保存到磁盘上 一定要序列化,因为对象在内存中也...
Java对象在内存中确实也是二进制的,但是直接将Java对象保存到磁盘上并不是一个可行的方法。这是因为在将对象保存到磁盘上的过程中,需要将对象的内存结构转换为一系列的二进制数据,并且需要考虑不同操作系统、不同JVM实现和不同版本之间的兼容性问题。这种方式非常复杂,且不具备跨平台和可移植性。
java序列化一个对象 标为obj1 如果obj1里有一个属性也为对象标为obj2...
Object[] myobj = {1,2,3,4};String str;for(int i = 0; i < myobj.length; i++){ Object obj = myobj[i];str = obj.toString();System.out.println(str);} 其中:Object[] myobj 得到对象数组 Object obj = myobj[i];得到对象数组中每个对象 str = obj.toString();...
java序列化的作用
序列化即是将一个对象的状态即各个属性量保存起来,然后在适当的时候再获得。对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,像在本地机上运行对象时一样。java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节...
javabean四种属性(javabean的特性)
1.Java中的属性,银此通常可以理解为竖搏运其属名性时根据get和set方法名得出的。 其规则是:去掉get或set后其剩余的字符串, 如果第二个字母是小写的,则把第一余梁个字母也变成小写 getAge---age getCPU---CPU 2.Java中的字段,通常叫做“类成员”。 这两个概念是完全不同的。 3.属性只局限于类中方法的...
serialversionuid的作用
2、serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性2有两种生成方式一个是默认的1L,比如private static final long serialVersionUID = 1L一个是根据类名接口名成员方。3、序列化ID,相当于身份认证,主要用于程序的版本控制,保持不同版本的兼容性,在程序...
jdk内有哪些约定俗成的命名规则和规范
8. 【强制】POJO 类中布尔类型的变量,都不要加 is,否则部分框架解析会引起序列化错误。 反例:定义为基本数据类型 Boolean isSuccess;的属性,它的方法也是 isSuccess(),RPC框架在反向解析的时候,“以为”对应的属性名称是 success,导致属性获取不到,进而抛出异常。 9. 【强制】包名统一使用小写,点分隔符之间有且...
java序列化不同JVM版本问题,怎么解决
当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID,类型为long的变量时,Java序列化机制会根据编译的class自动生成一个serialVersionUID作序列化版本比较用,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID 。如果我们不希望通过编译来强制划分软件版本...