2016-10-27 4 views
1

아이디어는이 상자 코드를 직렬화하는 것에 관한 것입니다. 이 프로그램은 플래시 카드를 만드는 것으로, 응용 프로그램이 파일을 종료 할 때 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 저장 상자 클래스가 방금 사용한 결과를 저장하려면 어떻게해야합니까? . 난 당신이 사람들을 다시 읽어 다음 파일로 플래쉬 카드 오브젝트를 저장하고 싶은 이해하는 것과

+0

당신이 그것을 기록하여 가장 쉽게 직렬화 객체 직렬화 'ObjectOutputStream'입니다. 클래스의 인스턴스로 그렇게하려고하면,'Flashcard' 클래스에'Serializable'을 구현해야 할 필요가 있다는 것을 알게 될 것입니다. –

+0

사실,이 두 클래스를 둘 다 직렬화 가능하지만 유일한 박스가 아닌 클래스로 만들어야합니다. 따라서 직렬화를 사용하면 원래 클래스에 아무 것도 실제로 적용되지 않습니다. – CPKNIGHT

+0

개체를 serialize하려면 개체에서 연결할 수있는 모든 개체를 serialize 할 수 있어야합니다. 귀하의 경우에는 'Flashcard'인스턴스가 포함될 가능성이 높습니다. 모든 클래스를 직렬화 가능하게 만드는 것 이외에는 할 수있는 방법이 있지만, 그렇게 할 수 있다면 모든 직렬화를하는 것이 가장 쉬운 방법 일 것입니다. 'java.io.Serializable' 인터페이스 자체는 메소드가 없기 때문에 구현하고자하는 클래스는 그렇게 선언 할 필요가 있습니다. –

답변

-1

여기에 설명하는 링크입니다 방법 : How to write and read java serialized objects into a file

+0

대답에있는 주요 정보로 다른 SO 질문에 대한 링크가 있으면 분명히이 질문을 복제본으로 한정하므로 정확하게 닫아야합니다. 그리고 주된 시도가 (무엇을 이해해야하는지에 대한) 명확한 설명을 얻는 것이 었다면 이것은 대답보다 더 많은 코멘트입니다. – Seelenvirtuose

+0

나는 그것을 중복으로 표시 할 특권이 없습니다. – donlys

+1

예. 이것이 내가 원하는거야. flashcard 객체를 파일로 저장하고 들어올 때 다시 읽습니다. 따라서 직렬화 클래스에서 호출 할 수 있도록 const!를 만들기 위해 close!와 같은 flashcard 클래스 또는 상자 클래스에 코드를 추가해야합니까? – CPKNIGHT