2013-08-03 2 views
0

저는 JAVA에 대해 더 배우기 위해 프로그램 작업을 해왔고 거의 완료되었습니다. 직렬화 작업을한지 얼마 안됐다. 심지어 닦은 후에도 여전히 뭔가 빠져있다. 이 클래스를 파일에 저장하려고하는데 NotSerialzableException이 발생합니다. 이 클래스 MonetaryField는 직렬화되어 디스크에 저장할 수있는 비 기본형 SingleField를 포함합니다. 또한 다음이 포함되어 결국JAVA : 클래스가 직렬화되지 않습니다

public class MonetaryField extends JPanel implements Serializable { 

    private static final long serialVersionUID = 1L; 
    public JLabel label; 
    public SingleField gold; 
    public SingleField silver; 
    public SingleField copper; 

    public MonetaryField() { 

    } 

    public MonetaryField(String s, boolean editable, boolean border) { 
      label = new JLabel(s); 
      gold = new SingleField("gold.png", border); 
      silver = new SingleField("silver.png", border); 
      copper = new SingleField("copper.png", border); 
      gold.addKeyListener(keys); 
      silver.addKeyListener(keys); 
      copper.addKeyListener(keys); 

      if(!editable) { 
        gold.setEditable(false); 
        silver.setEditable(false); 
        copper.setEditable(false); 
      } 
      GroupLayout layout = new GroupLayout(this);    
      this.setLayout(layout); 
      layout.setHorizontalGroup(
        layout.createSequentialGroup() 
         .addComponent(label) 
         .addComponent(gold) 
         .addComponent(silver) 
         .addComponent(copper) 
     ); 
      layout.setVerticalGroup(
        layout.createSequentialGroup() 
         .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
         .addComponent(label) 
         .addComponent(gold) 
         .addComponent(silver) 
         .addComponent(copper) 
        )); 
    } 

    public void setAmount(int g, int s, int c) { 
      gold.setValue(g); 
      silver.setValue(s); 
      copper.setValue(c); 
    } 

    public void setAmount(String g, String s, String c) { 
      gold.setValue(Integer.parseInt(g.replaceAll(",", ""))); 
      silver.setValue(Integer.parseInt(s.replaceAll(",", ""))); 
      copper.setValue(Integer.parseInt(c.replaceAll(",", ""))); 
    } 

    public void setAmount(int amount) { 
      gold.setValue(Math.floor(amount/10000)); 
      silver.setValue(((amount % 10000) - (amount % 100))/100); 
      copper.setValue(amount % 100); 
    } 

    public boolean sizeFits(Object field) { 
      SingleField s_field = (SingleField) field; 
      int max_chars = 4; 
      boolean g = s_field.getText().length() < max_chars; 
      if(!g) { 
        return false; 
      } 
      return true; 
    } 

    KeyListener keys = new KeyListener() { 
      @Override 
      public void keyTyped(KeyEvent e) { 
        if(!Character.isDigit(e.getKeyChar()) || sizeFits(e.getSource()) == false) { 
          e.consume(); 
        } 
      } 

      @Override 
      public void keyReleased(KeyEvent e) { } 

      @Override 
      public void keyPressed(KeyEvent e) { } 
    }; 

    public double getAmount() { 
      double d = 0.0; 
      d += Double.parseDouble(gold.getText()); 
      d += Double.parseDouble(silver.getText())/100; 
      d += Double.parseDouble(copper.getText())/10000; 
      return d; 
    } 
} 

이 내가 아는 것입니다 : 그것은 직렬화하고 성공적으로 디스크에 저장으로 비 원시 형 SingleField는 문제가되지 않습니다. 데이터로 저장하는 클래스에서 "e.getCause()"을 쿼리하면 "null"이라고 표시됩니다. 내가 "e.getMessage"을 돌려 주었을 때, "javax.swing.GroupLayout"에 기인했다. GroupLayout을 삭제 한 후 "e.getMessage()"은 "omnitool.MonetaryField$1"을 방금 반환했습니다. Omnitool이 주요 패키지입니다. 내가 남겨진 곳이 바로. 그리고 이제 막 스택 추적을 인쇄하려고했습니다 (e.getStackTrace(). toString). 그러나 그 모든 내용은 "[Ljava.lang.StackTraceElement;@6ab7501b"입니다 ... 누군가가 그 의미를 설명 할 수 있다면. 또한 몇 시간 동안 직렬화에 대한 연구를 이미 마쳤습니다.하지만 누구나 공유 할 수있는 좋은 자료가 있으면 멋질 것입니다.

답변

6

는 당신이 아닌 transient 필드 omnitool.MonetaryField$1라는 익명의 내부 클래스 인 keys라는이 나타나고,이 이유는이 원 '직렬화하지 않고

e.printStackTrace(); 

을 사용하여 내가 제안 스택 추적을 인쇄하려면 t 직렬화. 당신은 과도 할 수 있지만, 당신은 당신이 정의 할 수 있습니다 http://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html에서을 readObject 방법

을 정의하여 드 직렬화에 다시 작성해야합니다 것

private void readObject(java.io.ObjectInputStream stream) 
    throws IOException, ClassNotFoundException { 
    stream.defaultReadObject(); 
    // re-initialise transient fields. 
} 

난 당신이 데이터 전송 혼란 GUI 구성 요소를 피하기 제안 사물. 순수한 데이터를 포함하고 쉽게 직렬화되는 클래스와 해당 데이터를 시각화하는 별도의 GUI 구성 요소가 있으면 훨씬 더 쉽게 사용할 수 있습니다. "; @ 6ab7501b [Ljava.lang.StackTraceElement"


내가 지금 너희들을 위해 스택 추적을 인쇄하려고 (. e.getStackTrace의 toString()), 그러나 그것은 나에게 모든이었다. 누군가가 그 의미를 설명 할 수 있다면.

이것은 Java의 array.toString이 깨 졌음을 의미하며 일반 배열을 인쇄하려고하면 클래스를 인쇄하는 Object.toString()과 거의 사용하지 않는 System.identHashCode()를 사용합니다. Throwable.printStackTrace() 또는 Arrays.toString (array)와 같은 도우미 함수가 필요하거나 각 요소를 직접 인쇄하여 볼 수 있습니다.

+0

BAM! 너를 찔렀다. 다행히도 데이터를 다시 만들 필요가 없습니다. 또 다른 메모에서 그들은 정상적인 경우 두 가지 모두 나를 위해 인쇄합니다. 고마워요! – Kyle

+0

그리고 3 분 안에 답을 받아 들일 것입니다. – Kyle

+0

"둘 다 나를 위해 똑같이 인쇄합니다"라고하는 것이 무슨 뜻인지 모르겠다. –

0

문제는 일부 필드를 직렬화 할 수 없습니다 (java.io.Serializable 인터페이스를 구현하지 않음). SingleField : 또한 내가 클래스의 소스 코드를 볼 수 없습니다

transient KeyListener keys = new KeyListener() { 

오히려

KeyListener keys = new KeyListener() { 

이상 : 당신이 우리에게 보여준 것과

, 당신은 가야한다.java.io.Serializable 인터페이스를 구현하지 않는 경우 모든 필드를 일시적으로 표시해야합니다 (또는 인터페이스를 구현해야합니다).

관련 문제