2012-12-18 54 views
0

尝试反序列化对象列表时遇到一些问题。我已经将一列对象列入了一个.dat文件。如果我想稍后从该文件中检索数据,那么当我尝试反序列化该列表时,我不会得到期望的结果。这是代码。反序列化对象列表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"; 

没有格式化的值,因此可能会打印YEN 100.0美元100.0何时应该YEN 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