- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java SerialVersionUID作用详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
首先,说说Serializable是实现java将内存中的类存储至硬盘中而使用的 。
一个类使用了Serializalbe接口,在序列化到文件时,会有一个SerialVersionUID.
这个东东是用于对类进行版本控制的.
首先看Person类清单
===== 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import
java.io.Serializable;
public
class
Person
implements
Serializable {
//如果没有指定serialVersionUID,系统会自动生成一个
private
static
final
long
serialVersionUID = 1L;
private
String name;
//添加这么一个成员变量
private
String address;
//序列化后如果之前版本没有,就为null
public
String getName() {
// int a = 100;
// for(int i=0;i<a;i++){
// name+=i;
// }
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
}
|
===== 然后是测试类清单 ===== 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
import
java.io.FileInputStream;
import
java.io.FileNotFoundException;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.ObjectInputStream;
import
java.io.ObjectOutputStream;
/**
* if Object implements Serializable without Uid,
* system will automatically give this object a uid by algorithm
* @author v11
* @date 2014年9月18日
* @version 1.0
*/
public
class
WhySerialversionUID {
public
static
void
objectToFile(Object obj,String fileName)
throws
Exception{
ObjectOutputStream oo =
new
ObjectOutputStream(
new
FileOutputStream(
fileName));
oo.writeObject(obj);
oo.close();
}
public
static
Object getObjectFromFile(String fileName)
throws
Exception {
ObjectInputStream oi =
new
ObjectInputStream(
new
FileInputStream(
fileName));
Person crab_back = (Person) oi.readObject();
oi.close();
return
crab_back;
}
public
static
void
main(String[] args)
throws
Exception {
String fileName =
"crab_file"
;
//文件名
// 这里是把对象序列化到文件
Person crab =
new
Person();
crab.setName(
"Mr.Crab"
);
//储存到文件中
//objectToFile(crab,fileName);
// 这里是把对象序列化到文件,我们先注释掉,一会儿用
Person crabBack = (Person) getObjectFromFile(fileName);
//Dog crabBack = (Dog) getObjectFromFile(fileName);
System.out.println(
"Hi, My name is "
+ crabBack.getName());
}
}
|
===== 。
1.对于Person类中,将变量 address和SerialVersionUID注释掉,存储到文件,并读出。显示正常 。
2.将变量address还原,读取原来存储的文件,显示异常。抛出错误 InvalidClassException.
原因如下:
因为我们没有指定SerialVersionUID,因此系统自动生成了一个serialVersionUID(这个是根据类名,变量名,方法名)生成的 。
但是改动后的Person中变量名有变动,于是这个UID就不一样了,对于版本控制就无法读取.
所以,大家在很多代码里看到把UID设置为1L,就是Person代码中那样.
将Person代码UID设置为1L,再重复上述步骤,不报错。那么就意味着如果你选择将UID设置为1L,就是选择了兼容类的版本不一致.
PS:为什么说自动生成的 serialVersionUID是根据 类名,变量名,方法名,因为当你在原有的类的方法内进行添加内容,并不是对最后系统生成的UID造成影响,即不会抛出错误 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
class
Dog
implements
Serializable{
private
static
final
long
serialVersionUID = 1L;
private
String name;
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
}
|
新定义Dog类如上,将测试类代码中Dog的赋值注释去掉 。
//Dog crabBack = (Dog) getObjectFromFile(fileName),
运行结果抛出错误:
Exception in thread "main" java.lang.ClassCastException: serializable.Person cannot be cast to serializable.Dog 。
说明serializable在不同类一间并不矛盾.
到此这篇关于Java SerialVersionUID作用详解的文章就介绍到这了,更多相关Java SerialVersionUID内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/fjndwy/article/details/39374231 。
最后此篇关于Java SerialVersionUID作用详解的文章就讲到这里了,如果你想了解更多关于Java SerialVersionUID作用详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
这个问题已经有答案了: What is a serialVersionUID and why should I use it? (25 个回答) 已关闭 6 年前。 您好,我有一个关于 SerialV
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我在java中使用序列化类,在这些类中我需要指定serialVersionUID和一些要初始化的长数字。默认情况下为 private static final long serialVersi
public static List abc = new ArrayList(){{ //Asks for SerialVersionUID abc.add(5L);
我目前正在编写一个项目,其中有一个可序列化的类 ClientRepository。该类不指定任何serialVersionUID。当我尝试运行我的程序时,出现以下异常: Exception in
这是我试过的: 我使用 -Xlint:serial 选项构建项目,但收到此警告: MyClass.java:42: warning: [serial] serializable class has
在我的 Java 程序中添加文档时,我意识到大多数类都需要声明一个 serialVersionUID 常量属性。我究竟应该如何记录这个属性?如果我使用默认与生成的串行版本 UID,我是否会以不同的方式
我在一篇文章中看到,JVM默认提供的serialVersionUid是一个对象的hashcode。如果我们不重写类中的hashcode方法,通常hashcode是对象的内存地址,反序列化时如何计算ha
我正在尝试开发我的个人图书馆类(class),但遇到了障碍。我的实用程序类包含静态方法和常量,以及用于各种数据结构和子实用程序的几个公共(public)内部类。这些类不是静态嵌套类,它们旨在被实例化、
我已经阅读了一些有关 Java 如何控制对可序列化对象的访问的问题和讨论。我的问题是关于外部化对象以及为什么serialVersionUID应该影响它。我期望答案是“因为Externalized接口(
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: What does it mean: The serializable class does not decl
serialVersionUID 字段未命名为 SERIAL_VERSION_UID 是否有任何可行的原因? 根据 java.io.Serializable 的文档: A serializable c
当我在 Eclipse 中创建实现 Serializable 接口(interface)的 Java 类时,我收到警告 The serializable class ABCD does not dec
这个问题在这里已经有了答案: What is a serialVersionUID and why should I use it? (25 个答案) 关闭 9 年前。 在我的采访中,我有一个问题如
这个问题在这里已经有了答案: What is a serialVersionUID and why should I use it? (25 个答案) 关闭 4 年前。 如果我改变这个方法: pub
如果我实现 Externalizable,我是否需要在该类中指定 serialVersionUID 以实现版本兼容性? 换句话说,Java 在反序列化 Externalizable 对象时是否检查 s
我是 java 的新手,我有一个 Products 类,它是 Serializable。我不知道我做了什么,但我的程序停止工作并给了我这个错误: Exception in thread "main"
这个问题在这里已经有了答案: What is a serialVersionUID and why should I use it? (25 个答案) 关闭 9 年前。 每当我们尝试 seriali
我遇到了一个扩展异常的异常处理程序类,如下所示: public class AppFileReaderException extends Exception { //Explicit seri
如果我为我的类编写了一个 serialversionUid,比如 1234,并且我知道我的程序中没有其他类使用它,这样好吗,还是我总是必须使用编译器生成的 uid? 最佳答案 serialVersio
我是一名优秀的程序员,十分优秀!