3.private static final long serialVersionUID = 1L private static final long serialVersionUID = 1L;详解

private static final long serialVersionUID = 1L;详解

 

private static final long serialVersionUID = 1L;

 
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
public  class  User  implements  Serializable {
 
         /**
          * serialVersionUID
          */
         private  static  final  long  serialVersionUID = 1L;
         /**
          * 主键ID
          */
         private  Integer userId;
         /**
          * 用户名
          */
         private  String userName;
         /**
          * 密码
          */
         private  String passWord;
         /**
          * 姓名
          */
         private  String name;
         /**
          * 邮箱
          */
         private  String email;
         /**
          * 是否可用,0表示正常,1表示冻结
          */
         private  Integer state;
 
         /**
          * get、set方法
          *
          * @return
          */
         public  Integer getUserId() {
 
                 return  userId;
         }
 
         public  void  setUserId(Integer userId) {
 
                 this .userId = userId;
         }
 
         public  String getUserName() {
 
                 return  userName;
         }
 
         public  void  setUserName(String userName) {
 
                 this .userName = userName;
         }
 
         public  String getPassWord() {
 
                 return  passWord;
         }
 
         public  void  setPassWord(String passWord) {
 
                 this .passWord = passWord;
         }
 
         public  String getName() {
 
                 return  name;
         }
 
         public  void  setName(String name) {
 
                 this .name = name;
         }
 
         public  String getEmail() {
 
                 return  email;
         }
 
         public  void  setEmail(String email) {
 
                 this .email = email;
         }
 
         public  Integer getState() {
 
                 return  state;
         }
 
         public  void  setState(Integer state) {
 
                 this .state = state;
         }
 
}

实现java.io.Serializable这个接口是为序列化,serialVersionUID 用来表明实现序列化类的不同版本间的兼容性。如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会出错。 实现后如果你用的是工具的话会出来警告,他会提示你,可以自动生成private static  final  long  serialVersionUID  =  1L; 为了在反序列化时,确保类版本的兼容性,最好在每个要序列化的类中加入private static final long serialVersionUID这个属性,具体数值自己定义.   在JDK中,可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID,如对于Test.class可执行如下命令:serialver Test。 
这样,即使某个类在与之对应的对象已经序列化出去后做了修改,该对象依然可以被正确反序列化。否则,如果不显式定义该属性,这个属性值将由JVM根据类的相关信息计算,而修改后的类的计算结果与修改前的类的计算结果往往不同,从而造成对象的反序列化因为类版本不兼容而失败。 
不显式定义这个属性值的另一个坏处是,不利于程序在不同的JVM之间的移植。因为不同的编译器实现该属性值的计算策略可能不同,从而造成虽然类没有改变,但是因为JVM不同,出现因类版本不兼容而无法正确反序列化的现象出现。 当我们的系统不太经常需要序列化类时,可以去掉这些警告,做如下设置:Window-->Preferences-->Java,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会重新编译程序,那些警告信息也就消失了。
最后的建议是,如果我们开发大量需要序列化的类的时候,我们最好还是还原为原来的设置。这样可以保证系统的性能和健壮。
关于serialVersionUID的解释  serialVersionUID作用: 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 
你可以随便写一个,在Eclipse中它替你生成一个,有两种生成方式: 一个是默认的1L,比如:private static final long serialVersionUID = 1L; 一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:private static final long serialVersionUID = -8940196742313994740L;之类的。 Eclipse提示The serializable class XXX does not declare a static final serialVersionUID field of type long 那是Eclipse提供这个提示功能给你吧. 你点它warning的icon两下Eclipse就会自动给定. 如果你不喜欢,可以把它关掉, windows -> preferences -> compiler -> Error/Warnings -> Potential Programming problems 将Serializable class without serialVersionUID的warning改成ignore.
其实如果你没有考虑到兼容性问题时,那就把它关掉吧. 其实有这个功能是好的. 只要任何类别实作了Serializable这个介面, 如果没有加入serialVersionUID,Eclipse都会给你warning提示, 这个serialVersionUID为了让该类别Serializable後兼容.
考虑一下,如果今天你的类Serialized存到硬碟里, 可是後来你却更改了类别的field(增加或减少或改名). 当你Deserialize时,就会出现Exception.这样就会做成不兼容性的问题.
但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize. 这个可以避开不兼容性的问题.
异常状态: The serializable class XXX does not declare a static final serialVersionUID field of type long

private static final long serialVersionUID = 1L;

 
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
public  class  User  implements  Serializable {
 
         /**
          * serialVersionUID
          */
         private  static  final  long  serialVersionUID = 1L;
         /**
          * 主键ID
          */
         private  Integer userId;
         /**
          * 用户名
          */
         private  String userName;
         /**
          * 密码
          */
         private  String passWord;
         /**
          * 姓名
          */
         private  String name;
         /**
          * 邮箱
          */
         private  String email;
         /**
          * 是否可用,0表示正常,1表示冻结
          */
         private  Integer state;
 
         /**
          * get、set方法
          *
          * @return
          */
         public  Integer getUserId() {
 
                 return  userId;
         }
 
         public  void  setUserId(Integer userId) {
 
                 this .userId = userId;
         }
 
         public  String getUserName() {
 
                 return  userName;
         }
 
         public  void  setUserName(String userName) {
 
                 this .userName = userName;
         }
 
         public  String getPassWord() {
 
                 return  passWord;
         }
 
         public  void  setPassWord(String passWord) {
 
                 this .passWord = passWord;
         }
 
         public  String getName() {
 
                 return  name;
         }
 
         public  void  setName(String name) {
 
                 this .name = name;
         }
 
         public  String getEmail() {
 
                 return  email;
         }
 
         public  void  setEmail(String email) {
 
                 this .email = email;
         }
 
         public  Integer getState() {
 
                 return  state;
         }
 
         public  void  setState(Integer state) {
 
                 this .state = state;
         }
 
}

实现java.io.Serializable这个接口是为序列化,serialVersionUID 用来表明实现序列化类的不同版本间的兼容性。如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会出错。 实现后如果你用的是工具的话会出来警告,他会提示你,可以自动生成private static  final  long  serialVersionUID  =  1L; 为了在反序列化时,确保类版本的兼容性,最好在每个要序列化的类中加入private static final long serialVersionUID这个属性,具体数值自己定义.   在JDK中,可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID,如对于Test.class可执行如下命令:serialver Test。 
这样,即使某个类在与之对应的对象已经序列化出去后做了修改,该对象依然可以被正确反序列化。否则,如果不显式定义该属性,这个属性值将由JVM根据类的相关信息计算,而修改后的类的计算结果与修改前的类的计算结果往往不同,从而造成对象的反序列化因为类版本不兼容而失败。 
不显式定义这个属性值的另一个坏处是,不利于程序在不同的JVM之间的移植。因为不同的编译器实现该属性值的计算策略可能不同,从而造成虽然类没有改变,但是因为JVM不同,出现因类版本不兼容而无法正确反序列化的现象出现。 当我们的系统不太经常需要序列化类时,可以去掉这些警告,做如下设置:Window-->Preferences-->Java,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会重新编译程序,那些警告信息也就消失了。
最后的建议是,如果我们开发大量需要序列化的类的时候,我们最好还是还原为原来的设置。这样可以保证系统的性能和健壮。
关于serialVersionUID的解释  serialVersionUID作用: 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 
你可以随便写一个,在Eclipse中它替你生成一个,有两种生成方式: 一个是默认的1L,比如:private static final long serialVersionUID = 1L; 一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:private static final long serialVersionUID = -8940196742313994740L;之类的。 Eclipse提示The serializable class XXX does not declare a static final serialVersionUID field of type long 那是Eclipse提供这个提示功能给你吧. 你点它warning的icon两下Eclipse就会自动给定. 如果你不喜欢,可以把它关掉, windows -> preferences -> compiler -> Error/Warnings -> Potential Programming problems 将Serializable class without serialVersionUID的warning改成ignore.
其实如果你没有考虑到兼容性问题时,那就把它关掉吧. 其实有这个功能是好的. 只要任何类别实作了Serializable这个介面, 如果没有加入serialVersionUID,Eclipse都会给你warning提示, 这个serialVersionUID为了让该类别Serializable後兼容.
考虑一下,如果今天你的类Serialized存到硬碟里, 可是後来你却更改了类别的field(增加或减少或改名). 当你Deserialize时,就会出现Exception.这样就会做成不兼容性的问题.
但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize. 这个可以避开不兼容性的问题.
异常状态: The serializable class XXX does not declare a static final serialVersionUID field of type long

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
public  class  User  implements  Serializable {
 
         /**
          * serialVersionUID
          */
         private  static  final  long  serialVersionUID = 1L;
         /**
          * 主键ID
          */
         private  Integer userId;
         /**
          * 用户名
          */
         private  String userName;
         /**
          * 密码
          */
         private  String passWord;
         /**
          * 姓名
          */
         private  String name;
         /**
          * 邮箱
          */
         private  String email;
         /**
          * 是否可用,0表示正常,1表示冻结
          */
         private  Integer state;
 
         /**
          * get、set方法
          *
          * @return
          */
         public  Integer getUserId() {
 
                 return  userId;
         }
 
         public  void  setUserId(Integer userId) {
 
                 this .userId = userId;
         }
 
         public  String getUserName() {
 
                 return  userName;
         }
 
         public  void  setUserName(String userName) {
 
                 this .userName = userName;
         }
 
         public  String getPassWord() {
 
                 return  passWord;
         }
 
         public  void  setPassWord(String passWord) {
 
                 this .passWord = passWord;
         }
 
         public  String getName() {
 
                 return  name;
         }
 
         public  void  setName(String name) {
 
                 this .name = name;
         }
 
         public  String getEmail() {
 
                 return  email;
         }
 
         public  void  setEmail(String email) {
 
                 this .email = email;
         }
 
         public  Integer getState() {
 
                 return  state;
         }
 
         public  void  setState(Integer state) {
 
                 this .state = state;
         }
 
}

实现java.io.Serializable这个接口是为序列化,serialVersionUID 用来表明实现序列化类的不同版本间的兼容性。如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会出错。 实现后如果你用的是工具的话会出来警告,他会提示你,可以自动生成private static  final  long  serialVersionUID  =  1L; 为了在反序列化时,确保类版本的兼容性,最好在每个要序列化的类中加入private static final long serialVersionUID这个属性,具体数值自己定义.   在JDK中,可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID,如对于Test.class可执行如下命令:serialver Test。 
这样,即使某个类在与之对应的对象已经序列化出去后做了修改,该对象依然可以被正确反序列化。否则,如果不显式定义该属性,这个属性值将由JVM根据类的相关信息计算,而修改后的类的计算结果与修改前的类的计算结果往往不同,从而造成对象的反序列化因为类版本不兼容而失败。 
不显式定义这个属性值的另一个坏处是,不利于程序在不同的JVM之间的移植。因为不同的编译器实现该属性值的计算策略可能不同,从而造成虽然类没有改变,但是因为JVM不同,出现因类版本不兼容而无法正确反序列化的现象出现。 当我们的系统不太经常需要序列化类时,可以去掉这些警告,做如下设置:Window-->Preferences-->Java,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会重新编译程序,那些警告信息也就消失了。
最后的建议是,如果我们开发大量需要序列化的类的时候,我们最好还是还原为原来的设置。这样可以保证系统的性能和健壮。
关于serialVersionUID的解释  serialVersionUID作用: 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 
你可以随便写一个,在Eclipse中它替你生成一个,有两种生成方式: 一个是默认的1L,比如:private static final long serialVersionUID = 1L; 一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:private static final long serialVersionUID = -8940196742313994740L;之类的。 Eclipse提示The serializable class XXX does not declare a static final serialVersionUID field of type long 那是Eclipse提供这个提示功能给你吧. 你点它warning的icon两下Eclipse就会自动给定. 如果你不喜欢,可以把它关掉, windows -> preferences -> compiler -> Error/Warnings -> Potential Programming problems 将Serializable class without serialVersionUID的warning改成ignore.
其实如果你没有考虑到兼容性问题时,那就把它关掉吧. 其实有这个功能是好的. 只要任何类别实作了Serializable这个介面, 如果没有加入serialVersionUID,Eclipse都会给你warning提示, 这个serialVersionUID为了让该类别Serializable後兼容.
考虑一下,如果今天你的类Serialized存到硬碟里, 可是後来你却更改了类别的field(增加或减少或改名). 当你Deserialize时,就会出现Exception.这样就会做成不兼容性的问题.
但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize. 这个可以避开不兼容性的问题.
异常状态: The serializable class XXX does not declare a static final serialVersionUID field of type long

猜你喜欢

转载自www.cnblogs.com/sqkj0529/p/12765187.html
今日推荐