首页 > 试题广场 >

有以下一个对象,将此对象序列化为文件,并在另外一个JVM中读

[单选题]
有以下一个对象:
public class DataObject implements Serializable{
    private static int i=0;
    private String word=" ";
    public void setWord(String word){
        this.word=word;
    }
    public void setI(int i){
        Data0bject.i=i;
     }
}
创建一个如下方式的DataObject:
DataObject object=new Data0bject ( );
object.setWord("123");
object.setI(2); 
将此对象序列化为文件,并在另外一个JVM中读取文件,进行反序列化,请问此时读出的Data0bject对象中的word和i的值分别为:

  • "", 0
  • "", 2
  • "123", 2
  • "123", 0
推荐
这道题的答案应该是: D,序列化保存的是对象的状态,静态变量属于类的状态,因此,序列化并不保存静态变量。所以i是没有改变的
编辑于 2019-05-05 14:18:10 回复(7)

序列化的是对象,不是类,类变量不会被序列化


发表于 2019-06-14 09:11:57 回复(22)
Java在序列化时不会实例化static变量和transient修饰的变量,因为static代表类的成员,transient代表对象的临时数据,被声明这两种类型的数据成员不能被序列化。D
编辑于 2017-03-05 21:07:17 回复(11)
序列化保存的是对象的状态,静态变量属于类的状态,因此,序列化并不保存静态变量。所以i是没有改变的。 !!!!扩展:①实例化:是把类创建为对象的过程。格式一般为:{类名 对象名 = new 类名(参数1,参数2...参数n)构成},也就是new对象。②序列化:将对象的状态信息转换为可以存储或传输的形式的过程(对象转化为字节序列的过程)。序列化期间,对象将其当前状态写入到临时或持久性存储区。③反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
发表于 2019-05-23 14:22:58 回复(0)
题眼:将此对象序列化为文件,并在另外一个JVM中读取文件,进行反序列化,请问此时读出的Data0bject对象中的word和i的值分别为
静态成员属于类级别的,所以不能序列化,序列化只是序列化了对象而已,这里“不能序列化”的意思是序列化信息中不包含这个静态成员域,如果测试都在同一个机器(而且是同一个进程),因为这个jvm已经把i加载进来了,所以获取的是加载好的i,即2,如果是传到另一台机器或者关掉程序重新写个程序读入,此时因为别的机器或新的进程是重新加载i的,所以i信息就是初始时的信息,即0。所以,总结来看,静态成员是不能被序列化的,静态成员定以后的默认初始值是0,所以结果i是0 
一定要注意是在另外一个jvm中    ^_^
发表于 2021-09-24 15:08:14 回复(3)
这道题我觉得***:
目前原题为:
public class DataObject implements Serializable{
    private static int i=0;
    private String word=" ";
    public void setWord(String word){
        this.word=word;
    }
    public void setI(int i){
        Data0bject. i=I;     <------这个I是啥玩意?定义了么?一点也不严谨。
     }
}

发表于 2019-07-17 20:59:06 回复(8)
C  序列化时不保存静态变量,但静态变量属于类本身,故读出的i变量变成2
发表于 2015-01-04 09:32:50 回复(1)
本类中调用

发表于 2017-04-30 09:54:54 回复(0)
我这里的测试结果是D "123", 0
序列化不写入静态变量,换一个JVM,读出的i变量是初始化时的0,希望讨论。
发表于 2015-06-22 09:13:21 回复(1)
static和transient修饰的变量不参与序列化,所有变量 i 不变
发表于 2021-10-21 09:47:20 回复(0)
简单的来说就是静态变量不参与序列化,重新变回了0所以选D
发表于 2022-03-02 08:21:36 回复(0)
JAVA序列化时不保存静态变量,因为它是属于类层面上的状态,保存的应该是对象状态的变化。
发表于 2019-05-17 17:11:50 回复(0)
      
          JAVA 序列化保存(持久化)对象及其状态到内存或者磁盘
         使用 Java 对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对
象。必须注意地是,对象序列化保存的是对象的”状态”,即它的成员变量。由此可知,对象序列化不会
关注类中的静态变量。
补充:
    Transient 关键字阻止该变量被序列化到文件中
1. 在变量声明前加上 Transient 关键字,可以阻止该变量被序列化到文件中,在被反序列化后,
transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。
2. 服务器端给客户端发送序列化对象数据,对象中有一些数据是敏感的,比如密码字符串等,希望对
该密码字段在序列化时,进行加密,而客户端如果拥有解密的密钥,只有在客户端进行反序列化
时,才可以对密码进行读取,这样可以一定程度保证序列化对象的数据安全。
发表于 2022-02-01 15:14:59 回复(0)
static是属于类的,不会被序列化,序列化保存的对象的状态。
发表于 2021-09-29 23:25:01 回复(0)
静态变量属于类的一部分,相当于最原始的骨架,如果被修改了,仅仅是骨架表面的静态值改变了,但是并不能说明骨架形态也会改变,所以序列化当前对象后我们可以将当前对象的状态(this的修改)和骨架进行传递,对骨架的修改就不会被序列化。
发表于 2022-04-18 16:24:38 回复(0)
静态变量不参与序列化,所以恢复是默认值0
发表于 2022-03-27 10:23:15 回复(0)
序列化是可将java对象的状态形成.ser 格式的文件保存到硬盘,反序列化过程相反。静态变量属于类的状态,序列化并不保存类的状态。所以i的值未变化。
发表于 2021-02-03 12:03:54 回复(0)
序列化保存的是对象的状态,静态变量属于类的状态,因此,序列化并不保存静态变量。所以i是没有改变的。 !!!!
扩展:
①实例化:是把类创建为对象的过程。格式一般为:{类名 对象名 = new 类名(参数1,参数2...参数n)构成},也就是new对象。
②序列化:将对象的状态信息转换为可以存储或传输的形式的过程(对象转化为字节序列的过程)。序列化期间,对象将其当前状态写入到临时或持久性存储区。
③反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
发表于 2022-10-05 13:19:12 回复(0)
有一个比较有意思的地方是关于0和大写的O:由于本题代码段字体问题,零和欧都是一样弧度,但零的中间有一杠,前面是Object欧波债克特,后面是0bject零波债克特🤣🤣🤣
编辑于 2022-06-18 09:10:58 回复(0)
序列化的是对象,不是类,类变量不会被序列化
发表于 2021-06-23 12:24:40 回复(0)
这道题 首先是 I 而不是 i ,这个首先写错了.
我们假设它写对了 , 牢记一件事 序列化的 是 对象 ,而不是类 .故而这个类的变量也不会被序列化 .
我们知道,序列化是 将一个对象 转化为 二进制数据流 便于传输 ;反序列化 是 把二进制数据流 转为 对象 . 
不进行序列化的话,这个东西就无法传输,那么对类的变量赋值的那个操作是不会被读出来的 故而为 0
发表于 2021-02-16 13:33:18 回复(0)