用Java序列化对象

时间:2012-12-07 10:58:36

标签: java serialization

我有以下Java类:

public class GetCardInfoRequest implements RequestBase, java.io.Serializable{

public String CardID;
public String CardUniqueID;
public String who;
public String pass;

public GetCardInfoRequest(){}
public GetCardInfoRequest(String id, String uniqueid, String who, String pass){
    CardID = id;
    CardUniqueID = uniqueid;
    this.who = who;
    this.pass = pass;
}

@Override
public RequestType getRequestType() {
    return RequestType.GetCardInfo;
}

public String getCardID() {
    return CardID;
}

public String getCardUniqueID() {
    return CardUniqueID;
}
}

我遇到序列化问题。我一直在阅读关于java序列化的教程,但是所有这些都暗示着使一个对象可序列化就像简单地实现“java.IO.Serializable”接口一样容易,唯一需要注意的是没有非序列化字段。上课。

正如你在这里看到的,我实现了java.io.Serializable,我的所有字段都是简单的字符串(注意:我实现的“RequestBase”接口只是说类必须有getRequestType方法,没有别的)。 但是,当我尝试将类的实例序列化为字节数组时,就像这样:

ByteArrayOutputStream b = new ByteArrayOutputStream();
    ObjectOutputStream o = new ObjectOutputStream(b);
    o.writeObject(req);
    request = b.toByteArray();

引发了“Java.io.NotSerializableException”。 (在第3行)

我确信这是微不足道的,但由于所有教程都是如此通用,我不明白这个非常简单的代码有什么问题。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

NotSerializableException表示仅在类未实现Serializable时才会抛出它。该消息也应该是无法序列化的类的名称。可能的问题是:

  • 您没有传递您认为正在传递的对象(异常消息是什么?)
  • 您正在使用过时的GetCardInfoRequest类文件运行(尝试清理构建)

答案 1 :(得分:1)

Java中对象的序列化意味着将对象更改为某些字节。因此,您可以保存这些字节并通过反序列化来读取对象。请注意,此操作与平台和JVM无关。因此,您可以在一个平台中序列化对象,并在另一个平台中反序列化它。总之,serialize将对象转换为字节并反序列化将字节转换为对象。为了实施这些行动。您需要具有可序列化的对象:

public class Coordinate implements java.io.Serializable{
    int x;
    int y;
    Coordinate(int x, int y){
        this.x = x;
        this.y = y;
    }
}

您需要实现序列化和反序列化方法:

import java.io.*;

public class SerializeDeserializeExample {

    public static void main(String [] args) {
        Coordinate c = new Coordinate(10,77);

        //Serialize
        try {
            FileOutputStream fileOut =
                    new FileOutputStream("coordinate.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(c);
            out.close();
            fileOut.close();
            System.out.printf("Serialized data is saved in coordinate.ser");
        }catch(IOException i) {
            i.printStackTrace();
        }

        //Deserialize
        Coordinate d = null;
        try {
            FileInputStream fileIn = new FileInputStream("coordinate.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            d = (Coordinate) in.readObject();
            in.close();
            fileIn.close();
        }catch(IOException i) {
            i.printStackTrace();
            return;
        }catch(ClassNotFoundException e) {
            System.out.println("Coordinate class not found");
            e.printStackTrace();
            return;
        }

        System.out.println("Deserialized coordinate...");
        System.out.println("x: " + d.x);
        System.out.println("y: " + d.y);
    }

}

有关详细信息,请访问:https://github.com/m-vahidalizadeh/foundations/blob/master/src/algorithms/SerializeDeserializeExample.java

答案 2 :(得分:0)

嗯,我觉得自己像个白痴,但重启Eclipse解决了问题-_-

很抱歉浪费你的时间,但我已经习惯了Visual Studio,这是我第一次使用这个IDE,可能做了一些我不应该做的事情(这对我来说比VS更令人困惑我必须说)。

再次感谢您的帮助,对不起浪费您的时间。