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 に依存しないことに注意してください。したがって、あるプラットフォームでオブジェクトをシリアライズし、別のプラットフォームでデシリアライズできます。要約すると、シリアライズはオブジェクトをバイトに変換し、デシリアライズはバイトをオブジェクトに変換します。これらのアクションを実行するため。シリアライズ可能なオブジェクトが必要です。

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

また、serialize および deserialize メソッドを実装する必要があります。

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 に答える