1

我有以下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 行)

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

4

3 回答 3

2

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

  • 您没有传递您认为正在传递的对象(异常的消息是什么?)
  • 您正在使用过期的 GetCardInfoRequest 类文件运行(尝试干净的构建)
于 2012-12-07T11:15:23.697 回答
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 。

于 2016-09-25T22:01:36.157 回答
0

好吧,我觉得自己像个白痴,但是重新启动 Eclipse 解决了问题-_-

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

再次感谢您的帮助,也很抱歉浪费您的时间。

于 2012-12-07T11:17:18.077 回答