Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可序列化内部类_Java_Static_Inner Classes_Serializable_Notserializableexception - Fatal编程技术网

Java 可序列化内部类

Java 可序列化内部类,java,static,inner-classes,serializable,notserializableexception,Java,Static,Inner Classes,Serializable,Notserializableexception,我试图弄清楚为什么我的代码抛出java.io.WriteAbortedException:写操作中止;java.io.NotSerializableException:core.FlightOrder$FlightTicket异常 我已将班级声明为: public class FlightOrder implements Serializable public class FlightTicket 包含一组私人机票的 和一个内部类,声明为: public class FlightOrder

我试图弄清楚为什么我的代码抛出java.io.WriteAbortedException:写操作中止;java.io.NotSerializableException:core.FlightOrder$FlightTicket异常

我已将班级声明为:

public class FlightOrder implements Serializable 
public class FlightTicket
包含一组私人机票的

和一个内部类,声明为:

public class FlightOrder implements Serializable 
public class FlightTicket
我读到的解决方案是使内部类FlightTicket成为一个静态类,但我不确定这是我应该做的,以使我的代码正常工作。 有人能帮我找出解决这个问题的正确方法吗

public class FlightTicket
{
    /**
    * The passenger for this ticket
    */
    private Customer passenger;
    /**
     * passenger's seat
     */
    private int seat;
    /**
     * passenger's row
     */
    private int row;
    /**
     * The passenger's class in the plane 
     */
    private E_ClassType classType;

    /**
     * Full constructor
     * @param passenger
     * @param seat
     * @param row
     * @param classType
     */
    public FlightTicket(Customer passenger, int seat, int row , String classType)
    {
        this.passenger = passenger;
        setSeat(seat);
        setRow(row);
        setClassType(classType);
    }

    /**
     * Partial constructor
     * @param seat
     * @param row
     */
    public FlightTicket(int seat, int row)
    {
        setSeat(seat);
        setRow(row);
    }

    //-------------------------------Getters And Setters------------------------------
    /**
     * seat has to be positive number
     * @param seat
     */
    public void setSeat(int seat) {
        if(seat>0)
            this.seat = seat;
    }


    /**
     * row has to be positive number
     * @param row
     */
    public void setRow(int row) {
        if(row>0)
            this.row = row;
    }

    /**
     * 
     * @return classType
     */
    public E_ClassType getClassType() {
        return classType;
    }

    public int getSeat(){
        return seat;
    }
    public int getRow(){
        return row;
    }

    /**
     * set the class type from the array classType located in Constants.
     * if the classType not exists, the default value is Economy.
     * @param classType
     */
    public void setClassType(String classType) {

        for(E_ClassType c : E_ClassType.values())
        {
            if(c.toString().equals(classType))
            {
                this.classType = E_ClassType.valueOf(classType);
                return;
            }
        }
        this.classType = E_ClassType.Tourists;

    }

    public FlightOrder getOuterType() {
        return FlightOrder.this;
    }


    /* (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + getOuterType().hashCode();
        result = prime * result + row;
        result = prime * result + seat;
        return result;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        FlightTicket other = (FlightTicket) obj;
        if (!getOuterType().equals(other.getOuterType()))
            return false;
        if (row != other.row)
            return false;
        if (seat != other.seat)
            return false;
        return true;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "FlightTicket [passenger=" + passenger + ", seat=" + seat
                + ", row=" + row + ", flight number=" + getFlight().getFlightNumber() + "]";
    }

}// ~ END OF Inner Class FlightTicket

您只需要通过所有将被序列化的类实现可序列化接口。我的意思是,在serializable类中声明的所有实例变量类也应该实现serializable

在您的情况下,FlightTicket和Customer需要实现可序列化。

使内部类可序列化将起作用,如果您想将其与外部类一起序列化,这正是您应该做的。下面的代码演示:

public class Outer implements Serializable {
    class Inner implements Serializable {
        int value = 17;
    }

    Inner inner = new Inner();

    public static void main(String[] args) throws Exception {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ObjectOutputStream oout = new ObjectOutputStream(out);
        Outer obj = new Outer();
        obj.inner.value = 22;
        oout.writeObject(obj);
        Outer r = (Outer) new ObjectInputStream(new ByteArrayInputStream(
                out.toByteArray())).readObject();
        System.out.println(r.inner.value);
    }
}

输出为22,该值已从内部类字段正确序列化和反序列化。

是否使FlightTicket也实现可序列化?@AlanStokes尝试了该方法。不起作用,根据我所读到的,你没有必要这么做。内部/静态不重要,如果你想序列化一个对象,那么它必须是可序列化的。以什么方式不起作用?为什么FlightTicket不是静态的?它如何依赖于FlightOrder实例?您使用的每个类成员都需要可序列化。所以客户需要和FlightTicket一样可序列化。当两者序列化时,我在FlightTicket hashcode方法中的getOuterType上得到一个NullPointerException。也许知道为什么?他们都是。这不是本案的问题。谢谢你的帮助!