开发者社区> 问答> 正文

External反序列化异常?报错

java.io.InvalidClassException: Person; no valid constructor
        at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(Obje
ctStreamClass.java:147)
        at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:755
)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
751)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)

        at ReadObject.main(ReadObject.java:23)

public void setAge(int age)
	{
		this.age = age;
	}
	public int getAge()
	{
		return this.age;
	}

	public void writeExternal(java.io.ObjectOutput out)
		throws IOException
	{
		// 将name Field的值反转后写入二进制流
		out.writeObject(new StringBuffer(name).reverse());
		out.writeInt(age);
	}
	public void readExternal(java.io.ObjectInput in)
		throws IOException, ClassNotFoundException
	{
		// 将读取的字符串反转后赋给name Field
		this.name = ((StringBuffer)in.readObject()).reverse().toString();
		this.age = in.readInt();
	}
}
import java.io.*;
/**
 * Description:
 * <br/>网站: <a 
 * <br/>Copyright (C), 2001-2012, Yeeku.H.Lee
 * <br/>This program is protected by copyright laws.
 * <br/>Program Name:
 * <br/>Date:
 * @author Yeeku.H.Lee kongyeeku@163.com
 * @version 1.0
 */
public class WriteObject
{
	public static void main(String[] args) 
	{
		try(
			// 创建一个ObjectOutputStream输出流
			ObjectOutputStream oos = new ObjectOutputStream(
				new FileOutputStream("object.txt")))
		{
			Person per = new Person("孙悟空", 500);
			// 将per对象写入输出流
			oos.writeObject(per);
		}
		catch (IOException ex)
		{
			ex.printStackTrace();
		}
	}
}
import java.io.*;
/**
 * Description:
 * <br/>网站: <a
 * <br/>Copyright (C), 2001-2012, Yeeku.H.Lee
 * <br/>This program is protected by copyright laws.
 * <br/>Program Name:
 * <br/>Date:
 * @author Yeeku.H.Lee kongyeeku@163.com
 * @version 1.0
 */
public class ReadObject
{
	public static void main(String[] args)
	{
		try(
			// 创建一个ObjectInputStream输入流
			ObjectInputStream ois = new ObjectInputStream(
				new FileInputStream("object.txt")))
		{
			// 从输入流中读取一个Java对象,并将其强制类型转换为Person类
			Person p = (Person)ois.readObject();
			System.out.println("名字为:" + p.getName()
				+ "\n年龄为:" + p.getAge());
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}
	}
}

序列化没问题,反序列化报错,求解谢谢!



展开
收起
爱吃鱼的程序员 2020-06-22 15:37:19 538 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    Person提供一个无参数的默认构造函数

    你readExternal执行的前提是对象本身要存在,比如要提供默认构造函数给系统让他给你创建对象。


    谢谢+10086

    引用来自“逝水fox”的答案

    Person提供一个无参数的默认构造函数

    你readExternal执行的前提是对象本身要存在,比如要提供默认构造函数给系统让他给你创建对象。


    不明白序列化B时写入A对象是什么意思
    2020-06-22 15:37:34
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载