2012-12-18 3 views
0

У меня есть некоторые проблемы при попытке десериализации списка объектов. Я искал список объектов в файл .dat. Если я захочу получить данные из этого файла позже, когда я попытаюсь десериализовать этот список, я не получу желаемый результат. Вот код.Deserialize список объектов java

Сериализация:

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(); 
} 

Можете ли вы сказать мне, что случилось?

ответ

1

Не могли бы вы рассказать мне, что не так?

Есть много вещей, которые могут быть неправильными. Поскольку вы неспециалисты, мне придется использовать свое воображение.

Имена методов не соответствуют законам кодирования Java, которые не позволяют их легко читать. Использование форматирования кода поможет.

Наиболее очевидной проблемой является то, что вы только пишете поле value, что означает, что symbol будет null после того, как вы его десериализуете.

Также

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

такая же, как

System.out.println(element); 

И

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

не имеет форматирование значения поэтому оно может напечатать СЗМ 100.0 или USD 100,0, когда она должна быть СЗМ 100 и 100,00 долларов США, и это не очевидно, почему у вас есть «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()); 
    } 
} 
+0

Я изменил немного кода в настоящее время. Возможно, на этот раз читать легче. Спасибо – Cristina

+0

Можете ли вы дать понять, что вы считаете неправильным? –

+0

У меня нет ошибок, поэтому я действительно не знаю, что случилось. Я думаю, что что-то пошло не так, когда пытались десериализовать этот список объектов. – Cristina

Смежные вопросы