标签:name Externalizable age String address 序列化 public 自定义
简介
Java类通过实现 java.io.Serializable
接口以启用其序列化功能。未实现此接口的类将无法进行序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。
实现这个接口时通常都会自定义一个SerializableUID
,那么这个SerializableUID
是用来干什么的呢。
可以知道序列化是将对象的状态信息转换为可存储或传输的形式的过程。其实就是保存为字符串到磁盘里。那么当反序列化的时候其作用就来了,虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化ID
是否一致,这个所谓的序列化ID
,就是我们在代码中定义的serialVersionUID
。
简单来说就是反序列化的时候,发现serialUID
不一样的时候就报错.
而且在序列化的时候如果没有定义这个序列化id,系统会默认给上一个值。
序列化和反序列化的时候自定义操作
Java
中还提供了Externalizable
接口,也可以实现它来提供序列化能力。
Externalizable
继承自Serializable
,该接口中定义了两个抽象方法:writeExternal()
与readExternal()
。
原因是在序列化过程中,如果被序列化的类中定义了writeObject
和 readObject
方法,虚拟机会试图调用对象类里的writeObject
和readObject
方法,进行用户自定义的序列化和反序列化。
如果没有这样的方法,则默认调用是ObjectOutputStream
的 defaultWriteObject
方法以及ObjectInputStream
的defaultReadObject
方法。
使用demo如下
package com.felix.spring_cloud_one;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
public class TestVO implements Externalizable {
private String name;
private Integer age;
private String address;
public TestVO() {
}
public TestVO(String name, Integer age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeUTF(name);
out.writeUTF(address = name + age);
out.writeInt(age);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
name = in.readUTF();
address = in.readUTF();
age = in.readInt();
}
}
@Test
public void test1(){
TestVO vo = new TestVO("小张", 20, "nb");
File file = new File("a.user");
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(vo);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
TestVO vo2 = (TestVO) ois.readObject();
System.out.println(vo2);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
标签:name,Externalizable,age,String,address,序列化,public,自定义 来源: https://blog.csdn.net/weixin_43944305/article/details/122819518
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。