Java序列化整理

序列化:JVM中的Java对象转化为字节序列。

反序列化:字节序列转化为JVM中的Java对象。

序列化和反序列化就是在这两种(JVM中的java对象和字节序列)不同的数据结构之间做转化。

字节序列: 字节序列可以存储成文件,发送给前端​​​​​​​

transient关键字

被transient 修饰的对象不会被序列化

private transient String realName;

举例:

public class XiaoMei implements Serializable {
    private static final long serialVersionUID = -4575083234166325540L;

    private String nickName;
    private transient String realName;


    public XiaoMei(String nickName,String realName){
        this.nickName = nickName;
        this.realName = realName;
    }

    public String toString(){
        return String.format("XiaoMei.toString(): nickName=%s,realName=%s", nickName,realName);
    }
}
public class Test {
    public static void main(String[] args){
        String realName="王小美", nickName="王美美";
        XiaoMei x = new XiaoMei(nickName, realName);
        System.out.println("序列化前:"+x.toString());
        ObjectOutputStream outStream;
        ObjectInputStream inStream;
        //文件保存在本地,把这个路径换成自己的文件路径
        //mac的同学把jiangyoujun换成自己的用户名
        //windows的同学前面要加D:/这样的磁盘符号
        String filePath = "/Users/jiangyoujun/Documents/test.log";
        try {
            outStream = new ObjectOutputStream(new FileOutputStream(filePath));
            outStream.writeObject(x);

            inStream = new ObjectInputStream(new FileInputStream(filePath));
            XiaoMei readObject = (XiaoMei)inStream.readObject();
            System.out.println("序列化后:"+readObject.toString());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

java对象序列化成json的字节序列

@JSONField 注解详解和应用

@JSONField(ordinal =0)    序列化字段的顺序,默认是0
@JSONField(name = “”)    用于解决属性名和key不一致的情况,当前端传过来的字段名不一样的时候,我们可以在字段名上加上这个注解
@JSONField(format = “yyyy-MM-dd HH:mm:ss”)    用在Date属性上,自动格式化日期
@JSONField(serialize = false)    是否要把这个字段序列化成JSON字符串,默认是true
@JSONField(deserialize = false)    字段是否需要进行反序列化,默认是true

@JsonProperty和@JSONField注解的区别以及用法

1.目的

都是为了解决bean与json字段不一致问题,或者字段定义不符合前端所需要的标准

2.区别

1.框架不同:
@jsonProperty是 Jackson的包,而@jsonfield是fastjson的包

2.用法不同:
(1)bean转换成Json字符串:
@JsonProperty:ObjectMapper().writeValueAsString(Object value)
@JSONField:ObjectMapper().readValue(String content, Class valueType)
(2)Json字符串转化为bean:
@JsonProperty:ObjectMapper().readValue(String content, Class valueType)
@JSONField:JSONObject.parseObject(String content, Class valueType)
(3)@JSONField这个注解可以用于get、set以及属性上面

public class Test{
	
	/*
		注解在属性上的时候可以设置一些序列化、格式化的属性
		@JSONField(serialize = false)---->序列化的时候忽略这个属性
		@JSONField(format = "yyyyMMdd")---->序列化和反序列化额时候使用yyyyMMdd,一般在Date类型的字段上使用
	*/	
	@JSONField(serialize = false)
	public String Name;

	/*
		注解在set方法表示json转成bean的时候会将json中的Name属性赋值给实体类的Name
	*/
	@JSONField(name="Name")
	public void setName(String Name){
		this.Name = Name;
	}

	/*
		注解在get方法表示bean转换成json的时候会把实体类的Name属性值赋给json的Name
	*/
	@JSONField(name="Name")
	public String getName(){
		return this.Name;
	}


}

(3)@JSONproperty这个注解用于属性上面
如把trueName属性序列化为name,可以在属性名上面增加@JsonProperty(value=“name”)。
(4)jackson的@JsonIgnore使用
作用:在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。
使用方法:一般标记在属性或者方法上,返回的json数据即不包含该属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值