java问题 如图,集合序列化的报错要怎么改呢?写入文件和读取对象的代码都在图里了,哪写错了,求大神
展开全部
首先ArrayList继承了AbstractList类,实现了List,RandomAccess,Cloneable以及Serializable接口。
下面先来看一下Serializable接口,即序列化接口:
首先看一下什么是序列化:序列化的定义是一种将对象以一连串的字节描述的过程,在java中万事万物皆对象,在分布式环境中经常需要将对象从一段网络传到另一端网络。
来想下如果不使用序列化来传输对象会怎么样,结果自然是会报错。运行时报错:java.io.NotSerializableException,原因就是没有实现序列化接口。可是为什么要序列化呢,不能像在内存一样把对象作为参数传递呢?我再百度贴吧尚学堂吧看到一个解释感觉很有道理,引用过来:
这里首先要确定一件事,内存中将对象作为参数传递其实只是传递对象的引用(指针)。就像是继承一样,并非是将父类对象保存在子类对象之中,而是子类对象包含了父类对象的引用,在java内部继承是通过隐式的组合实现的。子类对象中会保存一个实例对象的引用super,引用指向父类。实际的方法调用中,java会优先在当前类对象中寻找名称相同的方法,如果没有,会根据super引用到父类对象中去寻找,所以,如果父类方法在子类中得到了重写,java会调用子类的方法,而不会调用被重写的父类的方法,这也是多态的实现机制。
所以,内存中传来传去的都是地址,如果直接将其存库,然后内存经过变化,取出来的引用肯定是变了,而java的优势是跨平台,在分布式的环境中,传递对象是非常普遍的,既然涉及到了传输,势必有相应的协议,序列化就是为了解决这个问题而出来的。 完。
现在几乎所有的应用程序都涉及网络I/O和磁盘I/O,而数据传输时都是以字节为单位的,所以所有的数据都必须能够序列化为字节。在Java中数据要被序列化为字节流,存储在文件中或在网络上传输,必须继承Serializable接口。
序列化的用处:永久性保存对象,保存对象的字节序列到本地文件或者数据库中、通过序列化以字节流的形式使对象在网络中进行传递和接收、通过序列化在进程之前传递对象。
然后看一下Serializable接口的声明:public interface Serializable {},由此可见序列化接口没有方法或者是字段,所以更像是一个标志,标识可序列化。
下面先来看一下Serializable接口,即序列化接口:
首先看一下什么是序列化:序列化的定义是一种将对象以一连串的字节描述的过程,在java中万事万物皆对象,在分布式环境中经常需要将对象从一段网络传到另一端网络。
来想下如果不使用序列化来传输对象会怎么样,结果自然是会报错。运行时报错:java.io.NotSerializableException,原因就是没有实现序列化接口。可是为什么要序列化呢,不能像在内存一样把对象作为参数传递呢?我再百度贴吧尚学堂吧看到一个解释感觉很有道理,引用过来:
这里首先要确定一件事,内存中将对象作为参数传递其实只是传递对象的引用(指针)。就像是继承一样,并非是将父类对象保存在子类对象之中,而是子类对象包含了父类对象的引用,在java内部继承是通过隐式的组合实现的。子类对象中会保存一个实例对象的引用super,引用指向父类。实际的方法调用中,java会优先在当前类对象中寻找名称相同的方法,如果没有,会根据super引用到父类对象中去寻找,所以,如果父类方法在子类中得到了重写,java会调用子类的方法,而不会调用被重写的父类的方法,这也是多态的实现机制。
所以,内存中传来传去的都是地址,如果直接将其存库,然后内存经过变化,取出来的引用肯定是变了,而java的优势是跨平台,在分布式的环境中,传递对象是非常普遍的,既然涉及到了传输,势必有相应的协议,序列化就是为了解决这个问题而出来的。 完。
现在几乎所有的应用程序都涉及网络I/O和磁盘I/O,而数据传输时都是以字节为单位的,所以所有的数据都必须能够序列化为字节。在Java中数据要被序列化为字节流,存储在文件中或在网络上传输,必须继承Serializable接口。
序列化的用处:永久性保存对象,保存对象的字节序列到本地文件或者数据库中、通过序列化以字节流的形式使对象在网络中进行传递和接收、通过序列化在进程之前传递对象。
然后看一下Serializable接口的声明:public interface Serializable {},由此可见序列化接口没有方法或者是字段,所以更像是一个标志,标识可序列化。
展开全部
Person类中添加以下属性
private static final long serialVersionUID = -8817344729308165483L;
Person类中添加空参构造器
public Person(){}
更多追问追答
追问
大神先给您采纳了,能问下为什么加上private static final long serialVersionUID = -8817344729308165483L; 就不会报错了呢,就一个常量而已,好神奇
追答
serialVersionUID 是序列化识别号, 反序列化时,需要比较serialVersionUID是否一致, 你可以百度一下,有更详细的介绍.
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询