java 序列号主要用于序列化和反序列化的识别,假设客户端C和服务端S原来使用同一个类A进行通信,C因为需求要加上一个新字段b,如果没有序列号做保证,二者之间就无法正常通信了,S收到C的序列化后的A请求,就会抛出InvalidClassException异常,如下代码line1注释,但是当加上序列号之后,如下代码line1打开,新加的字段为null。
原理和用法很简单,以下是测试代码,修改line1~4就可看到序列化id的作用。
import java.io.*; /** * @author : zhongxiankui */ public class SerializeUIDTest { /** * <p>Description: Customer实现了Serializable接口,可以被序列化<p> */ private static class Customer implements Serializable { // private static final long serialVersionUID = 1936056658480287561L; line1 //Customer类中没有定义serialVersionUID private String name; private int age; private String salary; private String salary1; public Customer(String name, int age) { this.name = name; this.age = age; } /* * @MethodName toString * @Description 重写Object类的toString()方法 * @author xudp * @return string * @see java.lang.Object#toString() */ @Override public String toString() { return "name=" + name + ", age=" + age + ", salary=" + salary; } public static void main(String[] args) throws Exception { // SerializeCustomer();// 序列化Customer对象 line2 Customer customer = DeserializeCustomer();// 反序列Customer对象 line3 System.out.println(customer);//line4 } /** * MethodName: SerializeCustomer * Description: 序列化Customer对象 * * @throws FileNotFoundException * @throws IOException * @author xudp */ private static void SerializeCustomer() throws FileNotFoundException, IOException { Customer customer = new Customer("gacl", 25); // ObjectOutputStream 对象输出流 ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream( new File("./Customer.txt"))); oo.writeObject(customer); System.out.println("Customer对象序列化成功!"); oo.close(); } /** * MethodName: DeserializeCustomer * Description: 反序列Customer对象 * * @return * @throws Exception * @throws IOException * @author xudp */ private static Customer DeserializeCustomer() throws Exception, IOException { ObjectInputStream ois = new ObjectInputStream(new FileInputStream( new File("./Customer.txt"))); Customer customer = (Customer) ois.readObject(); System.out.println("Customer对象反序列化成功!"); return customer; } } }