使用指针反序列化对象

时间:2014-03-27 06:29:27

标签: java deserialization

我正在尝试反序列化存储在Planet文件中的planetobject.txt类的9个对象:enter image description here

但它给我的错误说:

java.io.InvalidClassException: Planet; local class incompatible: stream classdesc serialVersionUID = -1020679419761445431, local class serialVersionUID = -3074022091766650572
    at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at LA7ex5a.main(LA7ex5a.java:20)

这是预期的输出(我没有得到):

Mercury 57910000.0  4880.0  3.30e23
Venus   108200000.0 12103.6 4.869e24
Earth   149600000.0 12756.3 5.972e24 
Mars    227940000.0     6794.0  6.4219e23
Jupitor 778330000.0 142984  1.900e27 
Saturn  1429400000.0    120536  5.68e26 
Uranus  2870990000.0    51118.0 8.683e25
Neptune 4504000000.0    49532.0 1.0247e26 
Pluto   5913520000.0    2274.0  1.27e22

如果有人能指导我问题是什么,我将不胜感激。

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.StringTokenizer;

public class LA7ex5a {
    public static void main(String[] args) throws IOException {
        ObjectInputStream objectinput = null;
        Planet [] planet = null;
        int i=0;
        try {
            objectinput = new ObjectInputStream(new FileInputStream("C:/Users/user/workspace/LA7ex5a/src/planetobject.txt"));

            planet = (Planet[])objectinput.readObject();
            planet = (Planet[])objectinput.readObject();
            while (i<0) {
                planet[i].print();
                i++;
            }
            objectinput.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
    }
}

import java.io.Serializable;

public class Planet implements Serializable {

    private String name;
    private double orbit, diameter, mass;

    public Planet(String name, double orbit, double diameter, double mass) {
        super();
        this.name = name;
        this.orbit = orbit;
        this.diameter = diameter;
        this.mass = mass;
    }

    public void print() {
        System.out.println(name+" "+orbit+" "+diameter+" "+mass);   
    }

}

2 个答案:

答案 0 :(得分:0)

您应该在类中声明serialVersionUID,就好像您没有明确地声明它,然后在编译时它会自动生成。因此,如果您之前已经对该对象进行了序列化并在类中进行了一些更改,那么可能已经更改了serialVersionUID。

对于类的serialVersionUID类的反序列化,序列化对象应匹配以从序列化对象获取对象实例。

在Planet class

中添加以下内容
private static final long serialVersionUID = -1020679419761445431L;

答案 1 :(得分:0)

试试这个:

首先在序列化和反序列化之前,你需要声明

 private static final long serialVersionUID = 1L;

因为您的类实现了Serializable接口 在你的Plannet课程中。然后你可以读作:

     objectinput = new ObjectInputStream(new FileInputStream(new File(
                "C:/Users/user/workspace/LA7ex5a/src/planetobject.txt"));
        planet = (Plannet[])objectinput.readObject();
        System.out.println(Arrays.toString(planet));
        objectinput.close();