2017-01-10 54 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的用法。