0

オブジェクトのリストを逆シリアル化しようとすると、いくつか問題が発生します。オブジェクトのリストを.datファイルにシリアル化しました。後でそのファイルからデータを取得したい場合、そのリストを逆シリアル化しようとすると、目的の結果が得られません。これがコードです。

シリアル化:

MyFile mf = new MyFile("2012-12-18.dat");
             mf.Open();
             FileOutputStream fos = mf.GetOS();

             Iterator<Element> currencies = cube.select("Rate").iterator();
             ISerializare[] lista = new ISerializare[31];
             int i=0;
             while (currencies.hasNext()){
                    MyCurrency newCurrency=new MyCurrency();
                    Element newElement=currencies.next();
                    newCurrency.setSymbol(newElement.attr("currency"));
                    newCurrency.setValue(Double.parseDouble(newElement.text()));
                    lista[i] = newCurrency;
                    System.out.println(newCurrency.toString());
                    i++;
             }
             DataOutputStream dos = new DataOutputStream(fos);

             for(int j=0;j<i;j++){
                 lista[j].ObjectSerialization(dos);
             }
             dos.close();
public class MyFile {

    File fisier;
    String name;

    public MyFile(String n){
        name = n;
    }

    public void Open(){
        fisier = new File(name);
    }

    public FileOutputStream GetOS() throws IOException{
        return new FileOutputStream(fisier);
    }

    public FileInputStream GetIS() throws IOException{
        return new FileInputStream(fisier);
    }
}



MyFile mf = new MyFile("2012-12-18.dat");
     mf.Open();    
     FileInputStream fis = mf.GetIS();
     DataInputStream dis = new DataInputStream(fis);

     for(ISerialization element:list){
         element.ObjectDeserialization(dis);
         System.out.println(element.toString());

MyCurencyクラスは次のとおりです。

    public class MyCurrency implements ISerialization
{
private String symbol;
private double value;
public String getSymbol() {
    return symbol;
}
public void setSymbol(String symbol) {
    this.symbol = symbol;
}
public double getValue() {
    return value;
}
public void setValue(double value) {
    this.value = value;
}
public String toString(){
    return symbol +" = "+value + " RON";
}
@Override
public void ObjectSerialization(DataOutputStream dos) throws IOException {
    dos.writeDouble(value);
}
@Override
public void ObjectDeserialization(DataInputStream dis) throws IOException {
    value = dis.readDouble();
}

何が悪いのか教えていただけますか?

4

1 に答える 1

1

何が悪いのか教えていただけますか?

間違っている可能性のあることがたくさんあります。あなたは具体的ではないので、私は私の想像力を使わなければなりません。

メソッド名は、読みやすくないJavaコーディング規約に準拠していません。コードフォーマッターを使用すると役立ちます。

最も明白な問題は、フィールドを書き込むだけであるということです。これは、デシリアライズした後にフィールドが作成されることvalueを意味します。symbolnull

また

System.out.println(element.toString());

と同じです

System.out.println(element);

return symbol +" = "+value + " RON";

値の書式が設定されていないため、100円と100.00円の場合、100.0円または100.0円と表示されることがあり、最後に「RON」が付いている理由がわかりません。


それがまったく役に立ったら、これは私がそれを書く方法です

Collection<Element> currencies = cube.select("Rate");

// write out
File mf = new File("2012-12-18.dat");
DataOutputStream dos = new DataOutputStream(
        new BufferedOutputStream(new FileOutputStream(mf)));
dos.writeInt(currencies.size()); // so you know how many to read.
for (Element currency : currencies) {
    MyMoney newCurrency = new MyMoney(currency);
    newCurrency.writeTo(dos);
}
dos.close();

// read in
DataInputStream dis = new DataInputStream(
        new BufferedInputStream(new FileInputStream(mf)));
int count = dis.readInt();
List<MyMoney> myMoneys = new ArrayList<>();
for (int i = 0; i < count; i++)
    myMoneys.add(new MyMoney(dis));
dis.close();

public class MyMoney {
    private final String symbol; // this is a currency
    private final BigDecimal value;

    public MyMoney(Element element) {
        this(element.attr("currency"), new BigDecimal(element.text()));
    }

    public MyMoney(DataInputStream dis) throws IOException {
        symbol = dis.readUTF();
        value = new BigDecimal(dis.readUTF());
    }

    public MyMoney(String symbol, BigDecimal value) {
        this.symbol = symbol;
        this.value = value;
    }

    public String getSymbol() {
        return symbol;
    }

    public BigDecimal getValue() {
        return value;
    }

    public String toString() {
        return symbol + " " + value;
    }

    public void writeTo(DataOutputStream dos) throws IOException {
        dos.writeUTF(symbol);
        dos.writeUTF(value.toString());
    }
}
于 2012-12-18T13:43:55.497 に答える