尽管实现了Serializable,我为什么会得到java.io.NotSerializableException:Investment.Date?

问题描述 投票:1回答:2

我正在尝试使用Date类将另一个实例写入文件实例的另一个类中的CompanySaver类。 Date类是Calendar类的子类,该类实现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;
    }
}

Date Class:

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();
        }
    }
}
java inheritance exception serialization notserializableexception
2个回答
0
投票

尝试在java.io.Serializable类中实现Date。否则,我会找到类似的帖子:https://stackoverflow.com/a/28080877/13113414


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.