java对象的序列化与反序列化(测试说明)

java中对象与字节码的转换称为序列化和饭序列化

应用:将java 对象写入文件

           将java对象在网络上进行传输

下面展示测试代码:

package com.wade;

import java.io.Serializable;

public class Person implements Serializable{
	/**
	 * 序列化唯一标识
	 */
	private static final long serialVersionUID = 1L;
	
	
	private String Name;
	private int age;
	private String sex;
	public String getName() {
		return Name;
	}
	public void setName(String name) {
		Name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
}
package com.wade;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Test {

	/**
	 * 将obj对象写入文件
	 * @param obj
	 * @throws Exception
	 */
	public static void writeData(Object obj) throws Exception {

		FileOutputStream fos = new FileOutputStream(
				"/home/wade/Desktop/data.d");
		ObjectOutputStream os = new ObjectOutputStream(fos);
		os.writeObject(obj);
		os.close();
		System.out.println("java 对象存储完成");
	}

	/**
	 * 从文件中读取对象
	 * @return
	 * @throws Exception
	 */
	public static Object readData() throws Exception {
		FileInputStream fis = new FileInputStream("/home/wade/Desktop/data.d");
		ObjectInputStream oi = new ObjectInputStream(fis);
		Object obj = oi.readObject();
		oi.close();
		System.out.println("java 对象读取完成");
		return obj;
	}

	
	public static void main(String[] args) throws Exception {
		Person person = new Person();
		person.setName("Wade");
		person.setAge(20);
		//将person写入文件
		Test.writeData(person);

		//读取person对象
		person = (Person) Test.readData();
		System.out.println(person.getName());
	}
}

执行结果:
java 对象存储完成
java 对象读取完成
Wade

当java bean中没有显示设置序列号,如果java对象的属性有改变(增加,减少等),这时会导致对于这个对象生成不同的序列号。如果在java bean属性改变之前将实例存入文件,在属性发生改变之后,读取之前存储的实例,这时会出现报错,见如下测试:

Exception in thread "main" java.io.InvalidClassException: com.wade.Person; local class incompatible: stream classdesc serialVersionUID = 2329171088176088046, local class serialVersionUID = -1730403105289999678
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:617)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1622)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at com.wade.Test.readData(Test.java:33)
at com.wade.Test.main(Test.java:48)

这是由于两次的序列号不匹配导致。





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值