0
2 classes DOG and Collar 

犬はシリアル化できない首輪を持っています

首輪には文字列と整数があります

質問: DOG オブジェクトをシリアライズするには? writeObject と readObject をオーバーライドしようとしましたが、collar の String メンバーの書き込み中にスタックしました 書き込みと読み取りの方法???

2クラスはこちら

import java.io.*;

public class Dog implements Serializable{

String name;
transient Collar c;

public Dog(String name, Collar c){
    this.name = name;
    this.c =c;

}

public static void main(String args[]){

    Dog d = new Dog("DogsName",new Collar("CollarsColor",3));


    try {
        File f = new File("dogs.ser");
        FileOutputStream fos = new FileOutputStream(f);
        ObjectOutputStream oos = new ObjectOutputStream(fos);

        oos.writeObject(d);
        oos.flush();
        oos.close();



        FileInputStream fis = new FileInputStream(f);
        ObjectInputStream ois = new ObjectInputStream(fis);


        Dog d2 =(Dog)ois.readObject();

        System.out.println(d2);
        ois.close();

    }
    } catch (Exception e) {

        e.printStackTrace();
    }


}

}   


public class Collar {
String color;
int size;

public Collar(){        
    color= "White";
    size =10;
}

public Collar(String c,int s){
    color =c;
    size =s;
}

} 
4

2 に答える 2

0

フィールド「c」は一時的とマークされているため、シリアル化時に渡されます。このフィールドをシリアライズ可能にする最も簡単な方法は、Collar クラスに Serializable インターフェイスを実装させることです。Collar クラスには String と int しか含まれていないため、シリアル化に問題はありません。

Collar タイプの 'c' フィールドを一時的なものとして保持し、その状態をシリアル化したい場合は、Collar のデータ メンバーの getter メソッドを追加し、次のように readObject および writeObject メソッドをDogクラスに追加します。

private void writeObject(ObjectOutputStream os) {
  try {
    os.defaultWriteObject();
    os.writeInt(c.getSize());
    os.writeObject(c.getColor());
  } catch (Exception e) {
    // handle exception
  }
}

private void readObject(ObjectInputStream is) {
  try {
    is.defaultReadObject();
    int collarSize = is.readInt();
    String collarColor = (String) is.readObject();
    this.c = new Collar(collarColor, collarSize);
  } catch (Exception e) {
    // handle exception
  }
}
于 2013-07-16T15:15:39.890 に答える