2

私は今、Java言語を使用してシリアル化を行う方法を学んでいます。この件に関するいくつかの投稿とドキュメントを読み、簡単な例を試してみました(以下)

public class SterializeObject implements java.io.Serializable{

        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        private String name;
        private transient int code;

        public SterializeObject (String n, int c){
            name = n;
            code = c;
        }

        public void printAtributes (){
            System.out.println("name: " + name + "; code: " + code);
        }
    }

    public class MainClass {
        public static void main(String[] agrs) {
            SterializeObject ob1 = new SterializeObject("ana", 1);
            SterializeObject ob2 = new SterializeObject("rita", 2);

            try {
                FileOutputStream fileOut = new FileOutputStream("file.data");
                ObjectOutputStream outObj = new ObjectOutputStream(fileOut);
                outObj.writeObject(ob1);
                outObj.writeObject(ob2);
                outObj.close();
                System.out.println("Objects were serialized!");
            } catch (IOException e) {
                e.printStackTrace();
            }

            ArrayList<SterializeObject> list = new ArrayList<SterializeObject>();
            try {
                FileInputStream fileInput = new FileInputStream("file.data");
                ObjectInputStream inputObj = new ObjectInputStream(fileInput);
                Object o;
                try {
                    while ((o = inputObj.readObject()) != null) {
                        list.add((SterializeObject) o);
                    }
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    System.out.println("Erro foi aqui! (1)");
                }

                inputObj.close();
                fileInput.close();
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("Erro foi aqui! (2)");
            }

            for (int i = 0; i < list.size(); ++i) {
                list.get(i).printAtributes();
            }
        }
    }

2 つの変数(名前) と一時的な (コード) をClass SterializeObject持つを作成しました。次に、主にそのクラスの2つのインスタンスを生成し、それをファイルに書き込もうとしましたが、成功しました! その後、ループで2つのオブジェクトを読み取ろうとします..私の問題があります..終了しているかどうかを確認するための何らかの方法がないためです。だから、私はこの条件でやろうとしました: .implements java.io.SerializablestringintObjectInputStream(o = inputObj.readObject()) != null

My output is this:
java.io.EOFException
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at MainClass.main(MainClass.java:30)
Objects were serialized!
Erro foi aqui! (2)
name: ana; code: 0
name: rita; code: 0

オブジェクトは取得できますが、存在しないものにアクセスしようとしていると思われるため、エラーが発生します。

誰かがそれを行う他の方法を教えてもらえますか?

よろしくお願いします。

4

7 に答える 7

4

すべてのオブジェクトを次々に書き込むのではなく、書き込まれたオブジェクトの数と同じ数のオブジェクトを読み取るか、オブジェクト自体のリストを書き込みます。

(またはストリームの終わりを検出するために EOFException に依存しますが、これは醜いです)。

于 2013-04-03T13:09:52.893 に答える
2

多くの人が私にそうするように言ったように、私は ArrayList を作成し、ArrayList をシリアライズしました。私のコードは次のとおりです。

public class MainClass {
    public static void main(String[] agrs) {
        SterializeObject ob1 = new SterializeObject("ana", 1);
        SterializeObject ob2 = new SterializeObject("rita", 2);

        ArrayList <SterializeObject> list = new ArrayList<>();
        list.add(ob1);
        list.add(ob2);

        ArrayList <SterializeObject> input = new ArrayList<SterializeObject>();

        try {
            FileOutputStream fileOut = new FileOutputStream("file.data");
            ObjectOutputStream outObj = new ObjectOutputStream(fileOut);
            outObj.writeObject(list);
            outObj.close();
            System.out.println("Objects were serialized!");
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            FileInputStream fileInput = new FileInputStream("file.data");
            ObjectInputStream inputObj = new ObjectInputStream(fileInput);
            Object o;
            try {
                input = (ArrayList<SterializeObject>) inputObj.readObject();

            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("Erro foi aqui! (1)");
            }

            inputObj.close();
            fileInput.close();
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Erro foi aqui! (2)");
        }

        for (int i = 0; i < input.size(); ++i) {
            input.get(i).printAtributes();
        }
    }
}

出力は次のとおりです。オブジェクトはシリアル化されました! 名前: アナ; コード: 0 名前: リタ; コード: 0

お手伝いありがとう!

于 2013-04-05T14:55:11.950 に答える
0

while ループをこのコードに置き換えます

do{
        try
        {
            o = inputObj.readObject();
            list.add((SterializeObject) o);
        }
        catch(EOFException e)
        {
            o = null;
        }
}while (o != null);
于 2013-04-03T13:21:15.410 に答える
0

これを行うには、readObject 呼び出しを try-catch ブロック内に配置し、取得した EOFException をキャッチして、すべてのオブジェクトを読み取ったことを通知します。

于 2013-04-03T13:13:58.600 に答える
0

シリアル化に JDK の ObjectInputStream / ObjectOutputStream を使用するのではなく、json-io ( https://github.com/jdereg/json-io ) などの Java-to-JSON および JSON-to-Java ライブラリの使用を検討してください。オブジェクトの配列をルートとして処理し、その中にサイクルを含むオブジェクト グラフなどを処理します。このようなライブラリでは、オブジェクトが Serializable または Externalizable を実装していることを確認する必要はありません。

シリアル化を行うコード例:

// Serialize an instanceo of the class EmployeeRecord emp
String json = JsonWriter.objectToJson(emp); 


// Deserialize it
EmployeeRecord e = JsonReader.jsonToJava(json);

シリアル化された JSON は、直接読み取ることができるブラウザーに返すことができ、Javascript コードがそれに基づいて動作できます。Java の ObjectInputStream / ObjectOutputStream ライブラリでは[簡単に]実行できません。ライブラリはわずか 83K で、他の依存関係はありません。

于 2015-01-14T13:21:13.903 に答える