首页编程java编程serial在java里表示什么意思?《java类中的serialVersionUID是什么作用》的评论

serial在java里表示什么意思?《java类中的serialVersionUID是什么作用》的评论

编程之家2023-10-1199次浏览

这篇文章给大家聊聊关于serial在java里表示什么意思,以及《java类中的serialVersionUID是什么作用》的评论对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

serial在java里表示什么意思?《java类中的serialVersionUID是什么作用》的评论

《java类中的serialVersionUID是什么作用》的评论

类中影响Serialization进程的特征,两边的操作使用的类版本不同,但它们的 serialVersionUID必须是一样的。它是用来识别两边的类是否兼容的,两边不同时不应该继续还原状态,而是应该停止下来,因为有人把事情搞错了。如果你的类没有实现 java.io.Serializable或 java.io.Externalizable,这个字段则没有意义。

如果你没听说过 Java Serialization(序列化,有人书翻译成串行化),那去找些 serialization介绍看看,下面说的第2段类结构变化时是中级水平的,理解 Java的一些细节才能理解,多数情况下人们只提到第一种情况(类的结构没有变化时),也只需要第一种情况。

当Serialization两端(比如Socket两端)使用一个类的不同版本时,我们必须提供 serialVersionUID,它可以用JDK自带的 serialver命令行来计算:

serial在java里表示什么意思?《java类中的serialVersionUID是什么作用》的评论

private static final long serialVersionUID= xxxx;

如果类中出现了下面两个方法,那么将会被用到,否则使用默认的实现:

private void readObject(ObjectInputStream) throws IOException,ClassNotFoundException;

serial在java里表示什么意思?《java类中的serialVersionUID是什么作用》的评论

private void writeObject(ObjectOutputStream)throws IOException;

记住这里出现的方法和字段都是 private.

新版本中仅增加了字段或方法而没有改变旧版本中已有的东西时,我们只要保证两个版本中的 serialVersionUID是一样的就行了.

具体样例可以看 JDK源码中的像 ArrayList这些类的代码的 readObject和 writeObject方法。

类的结构有些变化时,新版本对旧版本中某些东西进行了删减时, Field的变化我们需要在readObject和writeObject方法中进行处理

ObjectOutputStream.PutField类可达到这个目的

只是保证两个版本中的 serialVersionUID一致是行不通的

类中必需两个常量:

private static final long serialVersionUID;

private static final ObjectStreamField[] serialPersistentFields

下面样例是当客户端和服务端使用的类的版本不同并且类的结构也改变了,比如:

1

2

3

4

5

6

7

8

9

10

11

12

13

对方使用的类 Entry是:

public class Entry12...{

private String name, email;

private static final long serialVersionUID= 12L;

}

现在我们改变了类的设计了:

public class Entry12...{

private EntryInternal basic;

private static final long serialVersionUID= 12L;

private class EntryInternal{

private String name, email;

}

}

/*这是一段代码片段,我们假设新版本的类 name& email两个字段进行了修改

*(这里我们放到一个内部类EntryInternal中),而旧版本中直接属于这个类.

*

*请注意这里的字段和方法的签名,它们都是 private的或者是常量.

*/

public class Entry12 implements Serializable{

private EntryInternal pair= new EntryInternal();

/*这是必要的,因为版本不同*/

private static final long serialVersionUID= 12L;

**这也是必要的,否则写 putFields时会抛出异常.

* This field will be used by{@link#writeObject(ObjectOutputStream)},

* if this field is missing, follwing exception will be threw when invoke

*{@link java.io.ObjectOutputStream.PutField#put(String,)}:

* an exception‘java.lang.IllegalArgumentException: No such object field’ will be threw.

*/

private static final ObjectStreamField[] serialPersistentFields= new ObjectStreamField[]{

new ObjectStreamField("name", String.class),//

new ObjectStreamField("email", String.class),//

};

/*我们在这里不是直接写出字段,而把要写出的字段包装起来,

我们按需交换字段,而不是直接读写pair这个字段.

*/

private void readObject(ObjectInputStream input) throws IOException, ClassNotFoundException{

ObjectInputStream.GetField getFields= input.readFields();

/*请注意:使用 Serializable进行交换时不使用构造方法,所以这时 pair还未初始化.*/

pair= new EntryInternal();

pair.name=(String) getFields.get("name", null);

pair.email=(String) getFields.get("email", null);

}

/*写出时跟读入时一样*/

private void writeObject(ObjectOutputStream output) throws IOException{

ObjectOutputStream.PutField putFields= output.putFields();

putFields.put("name", pair== null? null: pair.name);

putFields.put("email", pair== null? null: pair.email);

output.writeFields();

}

…..

}

java中常用注解分别是什么及汉语意思!

Annotation(注解)是JDK5.0及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注释是以‘@注释名’在代码中存在的,根据注释参数的个数,我们可以将注释分为:标记注释、单值注释、完整注释三类。它们都不会直接影响到程序的语义,只是作为注释(标识)存在,我们可以通过反射机制编程实现对这些元数据的访问。另外,你可以在编译时选择代码里的注释是否只存在于源代码级,或者它也能在class文件中出现。

元数据的作用

如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类:

编写文档:通过代码里标识的元数据生成文档。

代码分析:通过代码里标识的元数据对代码进行分析。

编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。

基本内置注解

@Override java中覆写

@Deprecated的作用是对不应该在使用的方法添加注释,当编程人员使用这些方法时,将会在编译时显示提示信息,它与javadoc里的

@deprecated标记有相同的功能,准确的说,它还不如javadoc

@deprecated,因为它不支持参数

@SuppressWarnings,其参数有:

deprecation,使用了过时的类或方法时的警告

unchecked,执行了未检查的转换时的警告

fallthrough,当 Switch程序块直接通往下一种情况而没有 Break时的警告

path,在类路径、源文件路径等中有不存在的路径时的警告

serial,当在可序列化的类上缺少 serialVersionUID定义时的警告

finally,任何 finally子句不能正常完成时的警告

all,关于以上所有情况的警告

自定义注释

它类似于新创建一个接口类文件,但为了区分,我们需要将它声明为@interface,如:public@interface NewAnnotation{}............

二级计算机dateserial什么意思具体怎么应用

DateSerial函数是返回一个指定的日期。如 1991年 12月 31日,DateSerial函数中的每个参数的取值范围应该是可接受的;即,日的取值范围应在 1-31之间,而月的取值范围应在 1-12之间。但是,当一个数值表达式表示某日之前或其后的年、月、日数时,也可以为每个使用这个数值表达式的参数指定相对日期。

语法:

DateSerial(year, month, day)

DateSerial函数语法有下列的命名参数:

部分描述

year必要;Integer。从 100到 9999间的整数,或一数值表达式。

month必要;Integer。任何数值表达式。

day必要;Integer。任何数值表达式。

说明:

以下示例中使用了数值表达式代替绝对日期。这里,DateSerial函数返回 1990年 8月 1日的十年(1990- 10)零两个月(8- 2)又一天(1- 1)之前的日期;换句话说,就是 1980年 5月 31日。

DateSerial(1990- 10, 8- 2, 1- 1)

year参数的数值若介于 0与 29之间,则将其解释为 2000–2029年,若介于 30和 99之间则解释为1930–1999年。而对所有其它 year参数,则请用四位数值表示(如 1800)。

当任何一个参数的取值超出可接受的范围时,它会适时进位到下一个较大的时间单位。例如,如果指定了 35天,则这个天数被解释成一个月加上多出来的日数,多出来的日数将由其年份与月份来决定。如果一个参数值超出-32,768到 32,767的范围,就会导致错误发生。

如果你还想了解更多这方面的信息,记得收藏关注本站。

java后台开发要学什么(Java软件工程师一般要上哪些课程)moto360智能手表(moto 智能手表)