【问题标题】:Why am I getting java.io.NotSerializableException: Investment.Date despite implementing Serializable? [closed]为什么我得到 java.io.NotSerializableException: Investment.Date 尽管实现了 Serializable? [关闭]
【发布时间】:2020-04-12 19:29:14
【问题描述】:

我在另一个类中引用Date 类,我正在尝试使用CompanySaver 类将其写入文件的实例。 Date 类是日历类的子类,它实现了java.io.Serializable,除了从Calendar 类继承的3 个整数之外没有实例变量。类和堆栈跟踪如下。

堆栈跟踪:

java.io.NotSerializableException: Investment.Date
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
        at java.util.ArrayList.writeObject(ArrayList.java:762)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1028)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
        at Investment.CompanySaver.save(CompanySaver.java:32)
        at Investment.Investment.main(Investment.java:25)

日历类:

public class Calendar implements Serializable
{
    protected int month;
    protected int day;
    protected int year;
    protected int maxDay;

    protected static final long serialVersionUID = 2L;

    public void checkMaxDay()
    {
        if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
            maxDay = 31;
        else if (month == 2)
            maxDay=28;
        else if (year % 4 == 0 && month == 2)
            maxDay=29;
        else 
            maxDay=30;
        if(day>maxDay)
            day = maxDay;
    }

    public void checkMaxMonth()
    {
        if(month>12)
            month=12;
    }
}

日期类别:

package Investment;

public class Date extends Calendar
{
    Date()

    Date(int month, int day, int year)
    {
        if(month<13 && month>0)
            this.month = month;
        else
            throw new IllegalArgumentException("Month must be between 1 and 12");
        if(day<32 && day>0)
            this.day = day;
        else
            throw new IllegalArgumentException("Day must be between 1 and 31");
        if(year>2000)
            this.year = year-2000;
        else 
            this.year = year;
        checkMaxDay();
    }

    public String getDate() {return String.valueOf(month)+"/"+String.valueOf(day)+"/"+String.valueOf(year);}

    public void setDate(int month, int day, int year)
    {
        if(month<13 && month>0)
            this.month = month;
        else
            throw new IllegalArgumentException("Month must be between 1 and 12");

        if(day<32 && day>0)
            this.day = day;
        else
            throw new IllegalArgumentException("Day must be between 1 and 31");

        if(year>2000)
            this.year = year-2000;
        else 
            this.year = year;
        checkMaxDay();
    }

    public int getYear() {return year;}

    public int getMonth() {return month;}

    public int getDay() {return day;}

    public void setYear(int year) {this.year = year;}

    public void setMonth(int month) 
    {
        if(month<13 && month>0)
            this.month = month;
        else
            throw new IllegalArgumentException("Month must be between 1 and 12");
    }

    public void setDay(int day)
    {
        this.day = day; 
        checkMaxDay();
    }

    public boolean equals(Date date)
    {
        if(date.getDay() == this.day && date.getMonth() == this.month && date.getYear() == this.year)
            return true;
        else 
            return false;
    }

    public void subtract(int num, String unit)
    // Does not support +/- days
    {
        if(unit.equalsIgnoreCase("months"))
        {
            if(num<month)
                month = month-num;
            else if (num == month)
            {
                year--;
                month = 12;
            }
            else if (num<12)
            {
                year--;
                month = 12 -(num-month);
            }
            else if (num == 12) 
            {
                year--;
            }
            else 
            {
                year = year - (num/12);
                int num2 = num % 12;

                if(num2<month)
                    month = month-num2;
                else if (num2 == month)
                {
                    year--;
                    month = 12;
                }
                else
                {   
                    year--;
                    month = 12-(num2-month);
                }
            }
            checkMaxDay();
            day=maxDay; 
        }
        if(unit.equalsIgnoreCase("days"))
        {
            System.out.println("Date math does not support adding/subtracting days yet");
        }
        if(unit.equalsIgnoreCase("years"))
        {
            year = year - num;
            if(year<0)
                year = 0;
        }

        checkMaxDay();
        checkMaxMonth();
    }

    public void add(int num, String unit)
    {
        if(unit.equalsIgnoreCase("months"))
        {
            if(num + month <= 12)
                month = num + month;
            else if(num<=12)
            {
                year++;
                month = (month+num)-12;
            }

            else
            {
                int num2 = (num) % 12;
                year = year + (num/12);
                if(month + num2 >= 12)
                {
                    year++;
                    month = (month+num2)-12;
                }
                else
                    month = month + num2;
            }
        }
        if(unit.equalsIgnoreCase("days"))
        {
            System.out.println("Date math does not support adding/subtracting days yet");
        }
        if(unit.equalsIgnoreCase("years"))
        {
            year = year + num;
        }

        checkMaxDay();
        checkMaxMonth();
    }
}

CompanySaver 类:

package Investment;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class CompanySaver 
{ 
    private static final String filepath="C:\\Users\\Masiah\\Documents\\GitHUb\\Investments\\Companies\\";

    public static void save(Company comp) 
    {
        try 
        {
            FileOutputStream fileOut = new FileOutputStream(filepath+comp.getName());
            ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);
            objectOut.writeObject(comp);
            objectOut.close();
        } 

        catch (Exception ex) 
        {
            ex.printStackTrace();
        }
    }

    public static void save(Retail comp) 
    {
        try 
        {
            FileOutputStream fileOut = new FileOutputStream(filepath+comp.getName());
            ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);
            objectOut.writeObject(comp);
            objectOut.close();
        } 

        catch (Exception ex) 
        {
            ex.printStackTrace();
        }
    }
}

【问题讨论】:

  • 请添加完整的堆栈跟踪。
  • 刚刚添加了完整的堆栈跟踪
  • 日期类不可编译。请发布一个最小的工作示例。无参数构造函数存在语法问题。另外,请发布您如何使用序列化。在 ObjectOutputStream 上是简单的 writeObject() 吗?
  • 是的,我添加了应该保存该类的类,但它确实使用了您使用的方法。 date 类从 Calendar 类继承了它的所有变量,所以我认为一个最小的工作示例是一个空的 date 类(除非我缺少某些东西)。
  • 没有他的代码的解决方案不能应用于我的。我没有任何内部类或不可序列化的变量。

标签: java inheritance exception serialization notserializableexception


【解决方案1】:

可能您的课程已过时。尝试清理您的构建目录并重建您的项目。

【讨论】:

  • 刚刚尝试过,但出现了同样的异常。
猜你喜欢
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多