Java Serialization不同的Java版本

时间:2017-01-10 07:06:15

标签: java serialization

我有两个问题。

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的目的是唯一地识别一个类。它有助于(联合国)编组,但是如何(任何简单的例子都会被欣赏)。我们也可以使用自己的算法来生成SUID,以及如何在Java版本之间实现兼容?

提前致谢!

1 个答案:

答案 0 :(得分:1)

1)序列化过程不依赖于JDK版本,而是依赖于serialVersionUID。 serialVersionUID是序列化和反序列化兼容性的保证。

由于序列化过程中的错误,未引发

java.lang.ClassNotFoundException

2)SUID基本上是类名,接口类名,方法和字段的散列,类中的任何更改都将导致不同的SUID。您可以编写自己的算法来计算此值,但这是不可取的。

您可以参考此link以进一步探索serialVersionUID。

请参阅此tutorial以了解使用SUID。