0

私はこれに取り組んでおり、このエラーを取得してもエラーに指を置くことはできません:

この私のクラス:

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)

何か助けはありますか?

前もって感謝します :)

4

2 に答える 2

2

Java シリアライゼーションを使用する際の落とし穴の 1 つは、(通信用のデータ形式ではなく) 永続化フレームワークです。学生データを永続化してから、学生クラスを変更しました。ここで、永続化されたデータを読み込もうとすると、基本的にクラスの 2 つのバージョンが一致しないため、失敗します。学生クラスに手動で a を指定した場合serialVersionUID、シリアライゼーション フレームワークはデータ ファイルの読み取りを停止しませんでした (とにかくすぐに)。

しかし根本的な問題は、シリアライゼーションは永続性と同じではないということです。生徒のデータを保存したい場合は、クラス ファイルの非互換性に対する脆弱性が少ないフレームワークを選択する必要があります。CSV ファイルとして保存して開始することをお勧めします。また、プロジェクトの複雑さが保証される場合は、データベース ソリューションを検討することもお勧めします。


* 編集 *

一時的な修正として、クラスの名前を に戻し、シリアライゼーション フレームワークが期待するものにStudent設定することができます。serialVersionUIDこれは保証された修正ではなく、ファイルを作成してからクラスがどれだけ変更されたかによって異なります。

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

    // ...
}

プロジェクトでオブジェクト出力ストリームを使用する必要があるため、クラスにExternalizableインターフェイスを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
   }

   // ...
}
于 2012-04-27T04:44:26.727 に答える
0

Javadoc から取得:

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

public class InvalidClassException extends ObjectStreamException

シリアライゼーション ランタイムがクラスで次のいずれかの問題を検出した場合にスローされます。

  • クラスのシリアル バージョンが、ストリームから読み取ったクラス記述子のシリアル バージョンと一致しません
  • クラスに不明なデータ型が含まれています
  • クラスには、アクセス可能な引数なしのコンストラクターがありません
于 2012-04-27T04:38:27.757 に答える