Student类发生变动指的是什么意思?反序列化只是将持久化的对象读取到内存中转换成可以使用的java对象,之后才可以对其进行修改。
中文符号
>>>(按位右移不足补0),表示无符号右移!
右移表达式的位,不保留符号。
result = expression1 >>> expression2
参数解释:
result:任何变量。
expression1:任何表达式。
expression2:任何表达式。
说明:
>>> 运算符把 expression1 的各个位向右移 expression2 指定的位数。右移后左边空出的位用零来填充。移出右边的位被丢弃。例如:
var temp
temp = -14 >>> 2变量 temp 的值为 -14 (即二进制的 11111111 11111111 11111111 11110010),向右移两位后等于 1073741820 (即二进制的 00111111 11111111 11111111 11111100)。
toString()是重写显示Student类属性的方法,如果不重写,直接System.out.println(stu)显示的将是地址值
把项目编码调成gbk试下
你这已经是集合了,read出来的对象不能用单个对象来接收吧,所以一开始的错了
0开头,是八进制,自动转化为十进制就是205
demo/***.dat是文件在java工程中的路径,若不存在会自动在根路径下创建出demo文件夹,并在demo文件夹中创建***.dat文件。
demo代表***.dat文件所在的上一级文件夹的名字,是自己定义的文件夹名,跟系统无关。
你这是异常没有处理,他有个ClassNotFoundExcepiton异常是因为你读取的文件可能并读取不到这个类,你需要try-catch,并不是没有readObject这个方法
?????
一楼讲很清楚了。老师在课上也说了:双反斜杠,或者单斜杠都可以表示路径。看你习惯哪一种用法。
望采纳。如果还有什么不懂,可以私我,我会尽快回复。
.toSring();
用快捷键 try ...catch试试
因为此处有两个异常—— FileNotFoundException, IOException
,而他们都是Exception的子类
明白了。乱码才是正常的,因为序列化和反序列话是基于二进制流的,序列话便是把Student对象的信息以二进制存储在文件obj.bat中,用文本编辑器打开自然是乱码。只有通过反序列话才能将存储的二进制读取出来,然后显示在控制台上。
我自己创建了一个学生类,然后用你的代码就是不行,必须要强转
应该就是像你想的那样~感觉序列化就是在网络间通信,和数据的持久化存储时使用的!
serialVersionUID不一致,导致反序列化失败。
当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID,类型为long的变量时,Java序列化机制会根据编译的class(它通过类名,方法名等诸多因素经过计算而得,理论上是一一映射的关系,也就是唯一的)自动生成一个serialVersionUID作序列化版本比较用,这种情况下,如果class文件(类名,方法明等)没有发生变化(增加空格,换行,增加注释,等等),就算再编译多次,serialVersionUID也不会变化的。
你的这种异常是因为序列化对象之后又修改了该对象(增加空格,换行,增加注释,等等),使其编译后的class文件发生变化,导致程序执行时认为序列化的对象和反序列化的对象不是一种对象进而抛出异常。
如果你不希望程序因为serialVersionUID不同而反序列化失败,可以在实现java.io.Serializable接口的实体类中显示定义一个serialVersionUID的long常量(一般为1L),这样反序列化时就不会检查实体类是否改变了。
Ctrl键+鼠标左键
666
还有就是我写入一个对象后文件占43字节,写入2个对象后文件占48字节,写入3个对象后文件占53个字节......
因为在Student类中,你没有创建toString()方法
因为Student中的字段都会被默认的进行序列化,
如果有的字段被transient关键字修饰 则不会被序列化,需要手动序列化。
在Windows中后缀名,比如.dat .wmv .mp3.通过后缀名来区分不同的文件类型,进而让计算机知道用什么软件来打开,但对于读取文件因为都是byte的内容,不需要任何软件进行识别,只是简单读取,所以以什么后缀名结尾其实没那么重要,哪怕是 .zhebushihouzuiming 也可进行读取。
以上只是个人观点,如有错误希望指正! ^.^
都是IO包下的类,如果这个没有,那么其他的也会没有。你看看是不是没有导入包:
import java.io.ObjectInputStream;
1)序列化(Serialization):
在分布式环境下,无论是何种数据,都会以二进制序列的形式在网络上传输。序列化是一种将对象以一连串的字节描述的过程,用于解决在对对象流进行读写操作时所引发的问题。序列化可以将对象的状态写在流里进行网络传输,或保存在文件、数据库里,并在需要时把该流读取出来重新构造一个相同的对象。
要实现序列化的类必须
实现Serialization接口(位于java.lang包中);
使用一个输出流(如FileOutputStream)来构造对象流(如ObjectOutputStream)的对象;
使用该对象的writeObject(Object obj)方法将需要序列化的对象进行写出(即保存其状态)。
反序列化:
通俗的讲,就是将流转为对象。
要实现反序列化的类必须
使用一个输如流(如FileOutputStream)来构造对象流(如ObjectInputStream)的对象;
使用该对象的(ObjectInputStream)obj.readObject()方法将需要反序列化的流进行写入(流转为对象)
默认创建的文件不是utf-8的么
因为stu在之前的代码中已经被转化为一个字符串了
Stirng file =“demo/obj.dat" 这里仅仅是创建了一个字符串,并没有当做文件用。
还有File file="demo/obj.dat";这种创建文件对象的方法是完全错误的,正确写法是这样的:
File file=new File("demo/obj.dat");
回到刚才"为什么后来可以当做一个文件用":同上一句话可以改写成
File file01 =new File(file); //这里的的file引用上面的字符串
即我们做的只是对字符串的引用,然后创建了一个文件对象,并没有说我们把它当做一个文件来使用了。
同理老师源码:
String file = "demo/obj.dat";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
在这里也是做字符串引用的,两句话其实可以改写成一句话
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("demo/obj.dat"));