java 为什么静态成员会被序列化,如果我在同一个文件中序列化和反序列化一个对象[关闭]

798qvoo8  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(61)

**已关闭。**此问题为not reproducible or was caused by typos。目前不接受回答。

这个问题是由一个错字或一个无法再重现的问题引起的。虽然类似的问题可能在这里是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
3天前关闭。
Improve this question
如果我在同一个文件中序列化和非序列化一个对象,我不知道为什么静态成员也被序列化了,但是如果我注解了序列化部分,它就可以工作了。好吧,如果在类中完成了,它们有什么关系吗?根据文档,静态成员不能被序列化,但是这里的静态成员在打印出来时显示了序列化的值。

import java.io.*;

class Student_serial implements Serializable
{
    int rollNo;
    String name;
    String dept;
    float avg;

    public static int Data = 10;
    public transient int t = 100;

    public Student_serial()
    {

    }

    public Student_serial(int r, String n, String d, float a)
    {
        rollNo = r;
        name = n;
        dept = d;
        avg = a;

        Data = 500;
        t = 500;
    }

    public String toString()
    {
        return "\nStudent Details\n"+
                "\nRoll "+rollNo+
                "\nName "+name+
                "\nAverage "+avg+
                "\nDept "+dept+
                "\nData "+Data+
                "\nTransient "+t+"\n";
    }
}

public class Object_Stream_And_Serialisation {
    public static void main(String[] args)  throws Exception
    {

        //Serialisation of Object
        FileOutputStream fos = new FileOutputStream("C:/users/kbb91/Desktop/A-B-Java/Studetn3.txt");

        ObjectOutputStream oos = new ObjectOutputStream(fos);

        Student_serial s = new Student_serial(7, "KB", "Army", 9.5f);

        oos.writeObject(s);

        //Deserialization of Object
        FileInputStream fis = new FileInputStream("C:/users/kbb91/Desktop/A-B-Java/Studetn3.txt");

        ObjectInputStream ois = new ObjectInputStream(fis);

        Student_serial s1;

        s1 = (Student_serial) ois.readObject();

        System.out.println(s1);

    }

}

字符串
我正在获取的输出

Student Details

Roll 7
Name KB
Average 9.5
Dept Army
Data 500
Transient 0


预期输出

Student Details

Roll 7
Name KB
Average 9.5
Dept Army
Data 10
Transient 0

kg7wmglp

kg7wmglp1#

根据文档......实际上...... static字段不会被Java对象序列化序列化和非序列化。
这里实际发生的是,static int Data字段被第二个Student_serial构造函数设置为500
如果您将“保存学生”和“加载学生”功能放入两个类中,这样“加载学生”类就不会使用第二个构造函数,您将看到Data的值如您所期望的那样被报告。
您评论:
我的老师已经拒绝了我的答案,因为我的输出中,我得到的数据为500。
那么,为什么要在构造函数中设置为500呢?
备注:
1.构造函数不应该像这样设置静态字段。

  • 你有一个明显的风格问题:
  • 类标识符应该是以大写字母开头的 Camel 大小写,并且没有下划线
  • 变量标识符应该是以小写字母开头的驼峰大小写,并且没有下划线

如果你想让Java开发人员阅读你的代码,你需要遵循标准的Java风格。(选择一个特定的风格指南...)

相关问题