Java 可序列化内部类
我试图弄清楚为什么我的代码抛出java.io.WriteAbortedException:写操作中止;java.io.NotSerializableException:core.FlightOrder$FlightTicket异常 我已将班级声明为: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
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。也许知道为什么?他们都是。这不是本案的问题。谢谢你的帮助!