저는 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
"입니다 ... 누군가가 그 의미를 설명 할 수 있다면. 또한 몇 시간 동안 직렬화에 대한 연구를 이미 마쳤습니다.하지만 누구나 공유 할 수있는 좋은 자료가 있으면 멋질 것입니다.
BAM! 너를 찔렀다. 다행히도 데이터를 다시 만들 필요가 없습니다. 또 다른 메모에서 그들은 정상적인 경우 두 가지 모두 나를 위해 인쇄합니다. 고마워요! – Kyle
그리고 3 분 안에 답을 받아 들일 것입니다. – Kyle
"둘 다 나를 위해 똑같이 인쇄합니다"라고하는 것이 무슨 뜻인지 모르겠다. –