2012-04-27 4 views
0

私はこれに取り組んでいますと、このエラーを取得してもエラーに私の指を置くことはできません。エラーがで:java.io.InvalidClassException

この私のクラス:

package stdaccmdmngmt; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 
import java.util.Date; 
import java.util.HashSet; 
import java.util.Set; 
import javax.swing.JOptionPane; 

/** 
* 
* @author princess 
*/ 
public class Student1 implements Serializable { 

public static Set<Student1> listOfStudents = new HashSet<Student1>();  
public static File outFile = new File("StudentRegistry.dat"); 

// Data memebers 
private String studentID; 
private String name; 
private Date dateOfReg; 

//Constructor 
Student1(String number,String name) 
{ 
this.studentID = number; 
this.name = name; 
dateOfReg = new Date(); 
} 


public String getName() 
{ 
return name; 
} 

public String getStudentID() 
{ 
return studentID; 
} 

public Date getDateOfReg() 
{ 
return dateOfReg; 
} 

public void register() throws FileNotFoundException, IOException, ClassNotFoundException  
{ 
Set<Student1> sss = new HashSet<Student1>();  
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(outFile)); 
oos.writeObject(sss); 
oos.close();  
} 

public static HashSet<Student> getListOfStudents() throws FileNotFoundException, IOException, ClassNotFoundException 
{ 
HashSet ss; 
File inFile = new File("StudentRegistry.dat"); 
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(inFile)); 
Set<Student> aNewSet = (HashSet<Student>) ois.readObject(); 
return (HashSet<Student>) aNewSet; 
} 

public static Student getStudentbyID(String a) throws FileNotFoundException, IOException, ClassNotFoundException 
{ 
Set<Student> aNewSet = new HashSet<Student>(); 
aNewSet = Student.getListOfStudents(); 
Student result = null; 

for (Student x :aNewSet) 
{ 
     if (x.getStudentID().equalsIgnoreCase(a)) 
     { 
      result = x; 
      break; 
     } 
    } 
    if (result == null) 
    { 
     JOptionPane.showMessageDialog(null, "Apartment not found"); 
    } 
    return result;  

} 

    @Override 
public String toString() 
{ 
// include the code to retrieve assigned apartment  
return "Name: " + name +" StudentID: "+ studentID + " Registered On: " + dateOfReg; 
} 


    @Override 
public boolean equals(Object another) 
{ 
Student1 stud = (Student1)another; 
return this.name.equals(stud.name)&& this.studentID.equals(stud.studentID); 
} 

    @Override 
public int hashCode() 
{ 
int hash = name.hashCode(); 
return hash; 

}  
} 

と、これはテストクラスであります:

package stdaccmdmngmt; 

import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.HashSet; 
import java.util.Set; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

/** 
* 
* @author princess 
*/ 
public class Test { 

public static void main (String[]args) throws FileNotFoundException, ClassNotFoundException, IOException 
{   
Student1 s = new Student1("12345","Sasha"); 
     try { 
      s.register(); 
     } catch (FileNotFoundException ex) { 
      Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException ex) { 
      Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (ClassNotFoundException ex) { 
      Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
     } 

Set<Student> nnn; 
nnn = Student.getListOfStudents(); 
for (Student x : nnn) 

    System.out.println(x.toString());  

} 

} 
* @author princess 
*/ 
public class Student1 implements Serializable { 

public static Set<Student1> listOfStudents = new HashSet<Student1>();  
public static File outFile = new File("StudentRegistry.dat"); 

// Data memebers 
private String studentID; 
private String name; 
private Date dateOfReg; 

//Constructor 
Student1(String number,String name) 
{ 
this.studentID = number; 
this.name = name; 
dateOfReg = new Date(); 
} 


public String getName() 
{ 
return name; 
} 

public String getStudentID() 
{ 
return studentID; 
} 

public Date getDateOfReg() 
{ 
return dateOfReg; 
} 

public void register() throws FileNotFoundException, IOException, ClassNotFoundException  
{ 
Set<Student1> sss = new HashSet<Student1>();  
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(outFile)); 
oos.writeObject(sss); 
oos.close();  
} 

public static HashSet<Student> getListOfStudents() throws FileNotFoundException, IOException, ClassNotFoundException 
{ 
HashSet ss; 
File inFile = new File("StudentRegistry.dat"); 
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(inFile)); 
Set<Student> aNewSet = (HashSet<Student>) ois.readObject(); 
return (HashSet<Student>) aNewSet; 
} 

public static Student getStudentbyID(String a) throws FileNotFoundException, IOException, ClassNotFoundException 
{ 
Set<Student> aNewSet = new HashSet<Student>(); 
aNewSet = Student.getListOfStudents(); 
Student result = null; 

for (Student x :aNewSet) 
{ 
     if (x.getStudentID().equalsIgnoreCase(a)) 
     { 
      result = x; 
      break; 
     } 
    } 
    if (result == null) 
    { 
     JOptionPane.showMessageDialog(null, "Apartment not found"); 
    } 
    return result;  

} 

    @Override 
public String toString() 
{ 
// include the code to retrieve assigned apartment  
return "Name: " + name +" StudentID: "+ studentID + " Registered On: " + dateOfReg; 
} 


    @Override 
public boolean equals(Object another) 
{ 
Student1 stud = (Student1)another; 
return this.name.equals(stud.name)&& this.studentID.equals(stud.studentID); 
} 

    @Override 
public int hashCode() 
{ 
int hash = name.hashCode(); 
return hash; 

}  
} 

...........................

と、私はこのエラーを取得しています:

run: 
Exception in thread "main" java.io.InvalidClassException: stdaccmdmngmt.Student; local class incompatible: stream classdesc serialVersionUID = -3040096452457271695, local class serialVersionUID = -4849175799723926283 
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562) 
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583) 
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 
    at java.util.HashSet.readObject(HashSet.java:291) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 
    at stdaccmdmngmt.Student.getListOfStudents(Student.java:76) 
    at stdaccmdmngmt.Test.main(Test.java:34) 
Java Result: 1 
BUILD SUCCESSFUL (total time: 3 seconds) 

ヘルプがありますか?事前に

感謝:)

のJavadocから撮影

答えて

0

http://java.sun.com/j2se/1.4.2/docs/api/

パブリッククラスによりInvalidClassException は、直列化ランタイムが、と次のような問題 のいずれかを検出したときにObjectStreamException

がスローされる拡張クラス。

  • クラスのシリアルバージョンが
  • クラスはクラスがアクセスできる引数なしのコンストラクタ
を持っていない未知のデータ型
  • を含むストリームから読み込まれたクラス 記述と一致しません
  • +0

    あなたは、この説明はOPを支援する方法を少し詳しく説明していただけますか? – Garbage

    +0

    は、OPが自立するのを助けるためのここのモットーではありませんか? – Satya

    2

    Javaシリアル化を使用するうえでの落とし穴の1つは、永続フレームワーク(通信のデータ形式とは対照的)です。あなたは生徒データを保存してから、Studentクラスを変更しました。現在、永続化されたデータを試して読み込むと、基本的にクラスの2つのバージョンが一致しないため、失敗します。生徒のクラスに手作業でserialVersionUIDを指定していた場合、シリアル化フレームワークはデータファイルを読み込んでもすぐに突然終了することはありませんでした。

    しかし根本的な問題は、シリアライゼーションが永続性と同じではないことです。生徒データを保存する場合は、クラスファイルの非互換性の影響を受けにくいフレームワークを選択する必要があります。 CSVファイルとして保存することをお勧めします。また、プロジェクトの複雑さがあれば、データベースソリューションを見てみましょう。あなたが戻っStudentにクラスの名前を変更すると、シリアル化フレームワークが期待しているものにserialVersionUIDを設定してみてくださいすることができます一時的な修正として


    * EDIT *

    。オブジェクト出力ストリームを使用するようにプロジェクトのためにその要件は、私はExternalizableインタフェースを実装するお勧めしますので

    public class Student implements Serializable { 
        public static final long serialVersionUID = -3040096452457271695L; 
    
        // ... 
    } 
    

    :これは、それはあなたがファイルを作成したので、それはクラスがどれだけ変化したかに依存し、garaunteed修正ではありませんあなたのStudentクラス、そしてそれは、オブジェクト出力ストリームへの書き込み/読み込みするためのメソッドを実装するには:

    public class Student implements Serializable, Externalizable { 
        public static final long serialVersionUID = -3040096452457271695L; 
        // ... 
    
        @Override 
        public void writeExternal(ObjectOutput out) throws IOException { 
         out.writeUTF(getStudentID()); 
         out.writeUTF(getName()); 
         // etc 
        } 
    
        @Override 
        public void readExternal(ObjectInput in) throws IOException, 
         ClassNotFoundException { 
         setStudentID(in.readUTF()); 
         setName(in.readUTF()); 
         // etc 
        } 
    
        // ... 
    } 
    
    +0

    私はデータベースソリューションに行ってしまったでしょうが、私が尋ねることによると(ええええええええええええええええええええええええええと)、ioObjectStreamを使用する必要があります。エラーを修正する簡単な方法はありますか? – Sasha

    +0

    私の答えの編集を参照してください。 – Perception

    +0

    Netbeansで新しいプロジェクトを開き、EXACTコードをコピーしました。 (結局のところ、それはただのクラスでした)。とにかく。ここで何とか新しいファイルが作成されず、次のエラーが表示されます:pr 27、2012 9:55:01 AM hostelmanagement.HostelManagement main SEVERE:null java.io.FileNotFoundException:Student.dat指定されたファイル) \t(java.io.FileInputStream.open)(ネイティブメソッド) \t at java.io.FileInputStream (FileInputStream.java:106)hostelmanagement.Student.getListOfStudents(Student.java:86)hostelmanagement.HostelManagement.main(HostelManagement.java:42) のJava結果で – Sasha