【问题标题】:Serializing an object in Java在 Java 中序列化对象
【发布时间】:2016-09-26 06:01:36
【问题描述】:

我有以下 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”。 (第三行)

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

【问题讨论】:

  • 我们可以有堆栈跟踪吗?顺便说一句,添加private static final long serialVersionUID
  • 'o.writeObject(req);'什么是请求?
  • 请使用小写的成员变量名

标签: java serialization


【解决方案1】:

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

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

【讨论】:

  • 可能是第二个,因为重新启动 Eclipse 解决了问题(请参阅我自己的答案)。投票正确,感谢您的建议。
  • 从任何 IDE 迁移到另一个 IDE 总是令人困惑,因为一切都略有不同。不用担心。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2012-03-17
      • 1970-01-01
      相关资源
      最近更新 更多