Java基础系列(基础):Java序列化之java.io.Serializable!

Java基础系列(基础):Java序列化之java.io.Serializable!


前言

今天博主将为大家分享:Java基础系列(基础):Java序列化之java.io.Serializable!不喜勿喷,如有异议欢迎讨论!


什么是序列化

  • Java 对象序列化是 JDK 1.1 中引入的一组开创性特性之一,用于作为一种将 Java 对象的状态转换为字节数组,以便存储或传输的机制,以后,仍可以将字节数组转换回 Java 对象原有的状态。

  • 实际上,序列化的思想是 “冻结” 对象状态,传输对象状态(写到磁盘、通过网络传输等等),然后 “解冻” 状态,重新获得可用的 Java 对象。

  • 那么,这里就要归功于 ObjectlnputStream / ObjectOutputStream 类、完全保真的元数据以及程序员愿意用Serializable标识接口标记他们的类,从而 “参与” 这个过程。


序列化一个对象?

要序列化一个对象,这个对象所在类就必须实现Java序列化的接口:java.io.Serializable。


类添加序列化接口
package com.test;

import java.io.Serializable;

import lombok.Data;


/**
 * 
 * @Description: User用户实体类
 * @ClassName: User.java
 * @author ChenYongJia
 * @Date 2019年6月02日 晚上23:25
 * @Email [email protected]
 */
@Data
public class User implements Serializable {

	private static final long serialVersionUID = -8475669200846866662L;

	private String username;

	private String username2;

}

序列化/反序列化

可以借助commons-lang3工具包里面的类实现对象的序列化及反序列化,你没有必要自己写。

<!-- pom依赖 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.9</version>
</dependency>

上代码测试下:

package com.test;

Import org.apache.commons.lang3.SerializationUtils;

/**
 * 
 * @Description: switch case块
 * @ClassName: SerTest.java
 * @author ChenYongJia
 * @Date 2019年4月12日 晚上23:25
 * @Email [email protected]
 */
public class SerTest {

	public static void main(String[] args) {
		User user = new User();
		user.setUsername("ChenYongJia ");
		user.setUsername2("And MengMeng");

		byte[] bytes = SerializationUtils.serialize(user);

		User u = SerializationUtils.deserialize(bytes);

		System.out.println(u);
	}

}

输出:

User [username=ChenYongJia , username2=And MengMeng]

上例通过序列化对象字节到内存然后反序列化,当然里面也提供了序列化磁盘然后再反序列化的方法,原理都是一样的,只是目标地不一样。


序列化注意事项

  • 序列化对象必须实现序列化接口。

  • 序列化对象里面的属性是对象的话也要实现序列化接口。

  • 类的对象序列化后,类的序列化ID不能轻易修改,不然反序列化会失败。

  • 类的对象序列化后,类的属性有增加或者删除不会影响序列化,只是值会丢失。

  • 如果父类序列化了,子类会继承父类的序列化,子类无需添加序列化接口。

  • 如果父类没有序列化,子类序列化了,子类中的属性能正常序列化,但父类的属性会丢失,不能序列化。

  • 用Java序列化的二进制字节数据只能由Java反序列化,不能被其他语言反序列化。如果要进行前后端或者不同语言之间的交互一般需要将对象转变成Json/Xml通用格式的数据,再恢复原来的对象。

  • 如果某个字段不想序列化,在该字段前加上@Transient关键字即可。


到这里:Java基础系列(基础):Java序列化之java.io.Serializable!分享完毕了,快去试试吧!


最后

  • 更多参考精彩博文请看这里:《陈永佳的博客》

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!


猜你喜欢

转载自blog.csdn.net/Mrs_chens/article/details/94394447