아이디어는이 상자 코드를 직렬화하는 것에 관한 것입니다. 이 프로그램은 플래시 카드를 만드는 것으로, 응용 프로그램이 파일을 종료 할 때 fl ashapp 상자의 상태를 저장하고 시작시 파일을로드하기 위해 serializetion을 사용합니다. 그래서 나는 처음부터 모든 플래시 카드를 다시 할 필요가 없습니다.이 직렬화는 어떻게 작동합니까?
import java.util.ArrayList;
import java.util.Iterator;
public class Box implements java.io.Serializable {
private ArrayList<Flashcard> cards;
private double prossibility;
private double pivot; //determine the box's selected scope [pivot - prossibility,pivot)
public Box(){
cards = new ArrayList<Flashcard>();
prossibility = 0.0;
pivot = 0.0;
}
public Box(double prossibility,double pivot){
this.cards = new ArrayList<Flashcard>();
this.prossibility = prossibility;
this.pivot = pivot;
}
public Box(ArrayList<Flashcard> cards){
this.cards = cards;
}
public ArrayList<Flashcard> getCards() {
return cards;
}
public void setProssibility(double prossibility){
this.prossibility = prossibility;
}
public double getProssibility(){
return prossibility;
}
public void setPivot(double pivot){
this.pivot = pivot;
}
public double getPivot(){
return pivot;
}
public void addCard(Flashcard card){
cards.add(card);
}
public int searchCard(String challenge){
Iterator<Flashcard> it = cards.iterator();
int index = 0;
while(it.hasNext()){
Flashcard temp = (Flashcard)it.next();
if(temp.getChallenge().equals(challenge)){
break;
}
++index;
}
if(index >= cards.size())
index = -1;
return index;
}
public void removeCard(String challenge){
int index = searchCard(challenge);
if(index >= 0)
cards.remove(index);
}
} 내 플래시 카드 클래스처럼
: 상자 코드는 다음과 같다
enum ESide{
FRONT, //challenge side
BACK //response side
};
public class Flashcard implements Cloneable{
private String challenge;
private String response;
private ESide side;
private int boxIndex;
public Flashcard(){
challenge = new String();
response = new String();
side = ESide.BACK;
boxIndex = 0;
}
public Flashcard(String challenge, String response, ESide side){
this.challenge = challenge;
this.response = response;
this.side = side;
this.boxIndex = 0;
}
public Flashcard(String challenge, String response){
this.challenge = challenge;
this.response = response;
this.side = ESide.BACK;
this.boxIndex = 0;
}
public void setChallenge(String challenge){
this.challenge = challenge;
}
public String getChallenge(){
return challenge;
}
public void setResponse(String response){
this.response = response;
}
public String getResponse(){
return response;
}
public void setSide(ESide side){
this.side = side;
}
public ESide getSide(){
return side;
}
public void setBoxIndex(int index){
this.boxIndex = index;
}
public int getBoxIndex(){
return boxIndex;
}
public void flipSide(){
if(side == ESide.BACK)
side = ESide.FRONT;
else
side = ESide.BACK;
}
public Object clone(){
Flashcard o = null;
try {
o = (Flashcard)super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return o;
}
public boolean equals(Object o){
if(this == o)
return true;
if(o == null)
return false;
if(!(o instanceof Flashcard))
return false;
Flashcard temp = (Flashcard)o;
if(!temp.challenge.equals(this.challenge) || !temp.response.equals(this.response)){
return false;
}
return true;
}
}
내가 수행하신 직렬화 코드는 다음과 같다 :
import java.io.*;
public class Savingbox implements Serializable {
public static void main(String[] args){
Box e = new Box();
so 저장 상자 클래스가 방금 사용한 결과를 저장하려면 어떻게해야합니까? . 난 당신이 사람들을 다시 읽어 다음 파일로 플래쉬 카드 오브젝트를 저장하고 싶은 이해하는 것과
당신이 그것을 기록하여 가장 쉽게 직렬화 객체 직렬화 'ObjectOutputStream'입니다. 클래스의 인스턴스로 그렇게하려고하면,'Flashcard' 클래스에'Serializable'을 구현해야 할 필요가 있다는 것을 알게 될 것입니다. –
사실,이 두 클래스를 둘 다 직렬화 가능하지만 유일한 박스가 아닌 클래스로 만들어야합니다. 따라서 직렬화를 사용하면 원래 클래스에 아무 것도 실제로 적용되지 않습니다. – CPKNIGHT
개체를 serialize하려면 개체에서 연결할 수있는 모든 개체를 serialize 할 수 있어야합니다. 귀하의 경우에는 'Flashcard'인스턴스가 포함될 가능성이 높습니다. 모든 클래스를 직렬화 가능하게 만드는 것 이외에는 할 수있는 방법이 있지만, 그렇게 할 수 있다면 모든 직렬화를하는 것이 가장 쉬운 방법 일 것입니다. 'java.io.Serializable' 인터페이스 자체는 메소드가 없기 때문에 구현하고자하는 클래스는 그렇게 선언 할 필요가 있습니다. –