2012-11-11 3 views
2

정적 참조 및 transient 키워드로 표시된 개체를 제외하고 개체의 모든 변수를 포함하여 개체의 인스턴스를 저장하는 빠른 방법이라는 것을 알고 있습니다.Java에서 직렬화를 사용하는 가장 좋은 방법은 무엇입니까?

나는 입출력에별로 좋지 않다. 그리고 나의 애플리케이션은 3 가지 별개의 다른 객체 (객체를 포함하고있다)가있는 약 50 개의 클래스를 가지고있다.

예를 들어, 나는 동물 클래스, 직원 클래스, 차량 클래스 있습니다. 런타임에 인스턴스 객체를 포함하는 모든 하위 클래스, 메소드 등을 포함하는 모든 객체들.

제 질문은이 모든 정보를 직렬화로 저장하는 가장 쉬운 방법은 무엇입니까? 저는 교수님과 함께이 문제에 관해 토론을했고, "Data.class"이라는 포괄적 인 클래스와 같은 것을 제안했습니다. 모든 것이 "손"이고, 그 다음 그것을 직렬화합니다. 결국 .ser 파일을 참조하는 모든 객체를 저장하게됩니다.

나는 데이터을 확장은 " Data.class"를 만들고 모든 내 50 개 클래스를 만드는 방법에 대한 생각했다. 다음 내 저장 방식을 가진 그러나

public void saveData(){ 
     Data myData = new Data() 
try 
     { 
     FileOutputStream fileOut = 
     new FileOutputStream("Data.ser"); 
     ObjectOutputStream out = 
          new ObjectOutputStream(fileOut); 
     out.writeObject(myData); 
     out.close(); 
      fileOut.close(); 
     }catch(IOException i) 
     { 
      i.printStackTrace(); 
     } 
} 

같은 것을, 나는이 작업을 얻을 수없는 것. 나는 모든 하위 클래스에 대한 기본값 만 포함하는 빈 데이터 인스턴스를 만들기 때문에 그것이라고 생각합니다. 함수를 호출하려고 할 때 (해당 객체의 모든 값이 채워진 후) 저장하려고하지만 잘못된 것을 수행하고 무엇을 알아 내지 못합니다.

도움을 주시면 감사하겠습니다. 분명히 세 가지 유형의 객체의 모든 단일 인스턴스를 수동으로 직렬화 할 필요는 없습니다. 그것은 300 이상이고 나는 그것을하지 않는 것을 좋아할 것입니다.

또한 Data에 serialVersionID를 지정하고 Data에 대한 serializable 인터페이스를 구현했습니다.

답변

4

모든 클래스 확인은 Serializable 인터페이스를 구현하고이 Data 클래스는 Animal, Employee, Vehicle 및 다른 클래스 사용자를 역 직렬화/직렬화하는 방법이있다.

단일 메서드 saveData(Serializable serializable, String fileName)을 사용하면 쉽게이를 수행 할 수 있습니다.

public class Data { 

    public void saveData(Serializable serializable, String fileName) { 
     try { 
      FileOutputStream fileOut = new FileOutputStream(fileName); 
      ObjectOutputStream out = new ObjectOutputStream(fileOut); 
      out.writeObject(myData); 
      out.close(); 
      fileOut.close(); 
     } catch(IOException i) { 
      i.printStackTrace(); 
     } 
    } 
} 
+0

'Data myData = new Data();'는 생략하지 말고 오히려'serializable' ...;) – Mordechai

+0

을 직렬화하거나 Data 객체 자체에'this'를 직렬화하십시오. – Mordechai

+0

@ M.M. 사실, 나는 이것을 밤늦게 대답 했으므로 고려하지 않았습니다. 감사합니다 –

0

마크하는 것은 당신이 과도 또는 정적 직렬화하지 않으려는 어떤 변수 : 이것은 (실제 코드에 기반을 둔) 사용자의 요구에 골격이 될 것입니다. 더 많은 정보가 필요하거나 호기심이 생긴다면 here을보십시오.

+1

그들은 그냥 직렬화되지 않도록 그냥 정적으로하지 마십시오. 정적으로 인해 클래스의 개별 인스턴스가 아니라 클래스와 연관되어 변수가 의도 한 동작을 손상시킬 수 있습니다. 정적이 아닌 경우 일시적으로 사용하십시오. – ApproachingDarknessFish

관련 문제