2012-12-18 3 views
0

개체 목록을 deserialize 할 때 몇 가지 문제가 있습니다. 개체 목록을 .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