2017-01-10 81 views
0

我有兩個查詢。Java序列化不同的Java版本

i)這是我的主要課程。

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; 

@SuppressWarnings("javadoc") 
public class Serializer { 

    public static final String FILE_NAME = "Person.ser"; 

    public static void main(final String[] args) { 
    final Person person = new Person("Akash", 18, new Community("Hindu")); 
    try { 
     final File f = new File(FILE_NAME); 
     if (!f.isDirectory() && f.isFile()) { 
     System.out.println("File :: " + FILE_NAME 
      + " has been deleted ? " + f.delete()); 
     } 

     final ObjectOutputStream os = new ObjectOutputStream(
      new FileOutputStream(FILE_NAME)); 
     System.out.println("Writing object to file"); 
     System.out.println(person); 
     os.writeObject(person); 
     os.close(); 

     // Reading from file 

     final ObjectInputStream oins = new ObjectInputStream(
      new FileInputStream(FILE_NAME)); 

     System.out.println("Reading From File"); 
     System.out.println(oins.readObject()); 

    } catch (final FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (final IOException e) { 
     e.printStackTrace(); 
    } catch (final ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

class Person implements Serializable { 

    String name; 
    int age; 
    transient private Community community; 

    public Person(final String name, final int age, final Community community) { 
    super(); 
    this.name = name; 
    this.age = age; 
    this.community = community; 
    } 

    public String getName() { 
    return name; 
    } 

    public void setName(final String name) { 
    this.name = name; 
    } 

    public int getAge() { 
    return age; 
    } 

    public void setAge(final int age) { 
    this.age = age; 
    } 

    public Community getCommunity() { 
    return community; 
    } 

    public void setCommunity(final Community community) { 
    this.community = community; 
    } 

    @Override 
    public String toString() { 
    return "Person [name=" + name + ", age=" + age + ", community=" 
     + community + "]"; 
    } 

    private void writeObject(final ObjectOutputStream oos) { 
    try { 
     oos.defaultWriteObject(); 
     oos.writeObject(community.getName()); 
     oos.writeObject(this.getAge()); 
     oos.writeObject(this.getName()); 

    } catch (final IOException e) { 
     e.printStackTrace(); 
    } 
    } 

    private void readObject(final ObjectInputStream ois) { 
    try { 
     ois.defaultReadObject(); 
     community = new Community((String) ois.readObject()); 
     // person = new Person((String) ois.readObject(), 
     // (int) ois.readObject(), new Community(
     // (String) ois.readObject())); 
    } catch (ClassNotFoundException | IOException e) { 
     e.printStackTrace(); 
    } 
    } 
} 


class Community { 

    String name; 

    public Community(final String name) { 
    super(); 
    this.name = name; 
    } 

    public String getName() { 
    return name; 
    } 

    public void setName(final String name) { 
    this.name = name; 
    } 

    @Override 
    public String toString() { 
    return "Community [name=" + name + "]"; 
    } 

} 

我能夠生成Java 7的序列化文件,但是當我試圖讀取的Java 8相同的文件,是無法反序列化。我得到以下異常。

java.lang.ClassNotFoundException: Person 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:348) 
    at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:628) 
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1620) 
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1521) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1781) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) 
    at Serializer.main(Serializer.java: 

有什麼遺漏嗎?

2)我知道SUID的目的是唯一標識一個類。它有助於(un)編組的事情,但如何(任何簡單的例子,將不勝感激)。我們也可以使用我們自己的算法來生成SUID,以及如何在Java版本中實現兼容?

在此先感謝!

+0

它不應該是一個問題。請參閱此鏈接以獲取更多信息:http://www.oracle.com/technetwork/java/javase/compatibility-417013.html – user2004685

+0

問題在於類Person不在您的類路徑中。序列化序列化對象的狀態。不是類字節碼。你仍然需要在你的類路徑中有這個類。 –

回答

0

1)序列化過程不依賴於JDK版本,而是依賴於serialVersionUID。 serialVersionUID是序列化和反序列化兼容性的一個保證。

java.lang.ClassNotFoundException由於序列化過程中的錯誤而未引發。

2)SUID基本上是類名,接口類名,方法和字段的散列,類中的任何更改都會導致不同的SUID。你可以編寫自己的算法來計算這個值,但它不可取。

您可以參考此link進一步探索serialVersionUID。

請參考此tutorial瞭解SUID的用法。