7

私は Java で多くのクラスを持っていましたが、何かをシリアライズしようとしたのはこれが初めてです。配列リストを含む独自のクラスを作成しました。主なオブジェクトは、これらのクラスの配列リストです。私はすべてを正しく行ったと信じていますが、配列リストを読み返すと常に空です。

主な (主にテスト) クラス:

import java.io.*;
import java.util.ArrayList;

public class IOTest {
public static void main(String[] args) {
    ArrayList<Info> master = new ArrayList <Info>();
    Info a = new Info("a");
    Info b = new Info("a");
    Info c = new Info("a");
    master.add(a);
    master.add(b);
    master.add(c);
    print(master);
    save(master);
    ArrayList<Info> loaded = new ArrayList <Info>();
    load(loaded);
    System.out.println("Loaded List:");
    System.out.println("Loaded Size:" + loaded.size());
    print(loaded);
}

public static void save(ArrayList a){
    File f = new File("savefile.dat");
    try {
        FileOutputStream fos = new FileOutputStream(f);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(a);
        fos.flush();
        fos.close();
     } catch (IOException ioe) {
         System.out.println("Failed to save");
     };
}

public static void load(ArrayList a){
    File f = new File("savefile.dat");
    try {
        FileInputStream fis = new FileInputStream(f);
        ObjectInputStream ois = new ObjectInputStream(fis);
        try {
          a = (ArrayList<Info>) ois.readObject();
        } catch (ClassNotFoundException cnfe) { 
            System.out.println("Failed to load");
        }
        fis.close();
     } catch (IOException ioe) {
         System.out.println("Failed to load");
     }
}

public static void print(ArrayList a){
    System.out.println(a);
}
}

カスタム データ構造:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;


public class Info implements Serializable {
private static final long serialVersionUID = -5781559849007353596L;

ArrayList<String> list;
public Info( String e) {
    list = new ArrayList<String>();
    list.add(e);
}
@Override
public String toString() {
    return list.toString();
}

private void readObject(ObjectInputStream aInputStream) throws ClassNotFoundException, IOException {
    aInputStream.defaultReadObject();
}

private void writeObject(ObjectOutputStream aOutputStream) throws IOException {
    aOutputStream.defaultWriteObject();
}
}

誰かが私が間違っていることを指摘できれば、とても感謝しています。

4

3 に答える 3

5

この問題はシリアライゼーションとは関係ありません。

reference of passed parameterメソッド内のリストを変更しload()ていますが、変更された参照にはそのメソッドまでのスコープしかないため、これは機能しません。荷重を以下に変更

public static ArrayList<Info> load() {//Change return type
    File f = new File("savefile.dat");
    try {
        FileInputStream fis = new FileInputStream(f);
        ObjectInputStream ois = new ObjectInputStream(fis);
        try {
            ArrayList<Info> a = (ArrayList<Info>) ois.readObject();//get the object that is read
            return a;
        } catch (ClassNotFoundException cnfe) {
            System.out.println("Failed to load");
        }
        fis.close();
    } catch (IOException ioe) {
        System.out.println("Failed to load");
    }
    return null;
  }

そして、返されたオブジェクトを使用します。

 ArrayList<Info> loaded = load();
于 2012-10-09T08:02:29.187 に答える
0

コードに問題はありません。

ただし、ここには論理的な問題があります。

ArrayList<Info> loaded = new ArrayList <Info>();
load(loaded);

空の ArrayList をロードしようとしています (そのため、何も出力されません)。あなたがロードしたいのはマスターのものだと思います

load(master);
于 2012-10-09T08:02:57.663 に答える
0

このコードを試してください....

結果 :

[[a], [a], [a]] ロード済みリスト: ロード済み サイズ:3 [[a], [a], [a]]

package com.palit.java.serialize;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Init {
public static void main(String[] args) {
    ArrayList<Info> master = new ArrayList<Info>();
    Info a = new Info("a");
    Info b = new Info("a");
    Info c = new Info("a");
    master.add(a);
    master.add(b);
    master.add(c);
    print(master);
    save(master);
    List<Info> loaded = new ArrayList<Info>();
    loaded = load();
    System.out.println("Loaded List:");
    System.out.println("Loaded Size:" + loaded.size());
    print(loaded);
}

public static void save(ArrayList a) {
    File f = new File("savefile.dat");
    try {
        FileOutputStream fos = new FileOutputStream(f);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(a);
        fos.flush();
        fos.close();
    } catch (IOException ioe) {
        System.out.println("Failed to save");
    }
    ;
}

public static List load() {
    List list = new ArrayList();
    File f = new File("savefile.dat");
    try {
        FileInputStream fis = new FileInputStream(f);
        ObjectInputStream ois = new ObjectInputStream(fis);
        try {
            list = (ArrayList<Info>) ois.readObject();
        } catch (ClassNotFoundException cnfe) {
            System.out.println("Failed to load");
        }
        fis.close();
    } catch (IOException ioe) {
        System.out.println("Failed to load");
    }

    return list;
}

public static void print(List a) {
    System.out.println(a);
}
}
于 2012-10-09T08:08:09.970 に答える