2011-09-14 3 views
1

나는 blog을 거치며 한 가지 질문이 내 머리에 들어왔다. ObjectOutputStream가 쓰는 방법을 덮어 쓸 수 있습니까? 자바 직렬화 사용자 정의

이의 내가 out.dat 파일에 쓰고 있다고 가정 해 봅시다 즉 내가 ++ 메모장에서 out.dat 파일을 열어, 난 이진 데이터를보고

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("C:\\out.dat"))); 
out.writeObject(o); 

. 어떤 의미가 있습니다. 이 데이터가 쓰여지는 방식을 사용자 정의하고 싶다면 어떻게해야할까요? 말하자면 JSON 형식으로 된 out.dat 파일을 원한다고 가정 해 봅시다 (그저 하나의 예제 일뿐입니다. 다른 형식 일 수도 있습니다). 어떤 방법으로이 작업을 덮어 써야합니까?

답변

1

Externalizable을 구현하고 writeExternal 및 readExternal 메서드를 재정 의하여 원하는 것을 수행 할 수 있습니다. 자세한 내용은 http://download.oracle.com/javase/7/docs/platform/serialization/spec/output.html#3146을 참조하십시오.

하나의 객체의 직렬화 출력을 사용자 정의 할 수 있지만 전체 스트림의 형식은 사용자 정의 할 수 없습니다. 따라서 다른 이진 데이터 내에서 JSON 문자열을 찾을 수 있습니다.

사용자 정의 직렬화 메커니즘을 찾고 시나리오에서는
0

저는 자바가 JSON에 직렬화하기위한 내부 지원을 가지고 있지 않다는 것을 확신합니다. 나는 그것을 이해 (때문에 출력에 기본 FileOutputStream을 사용하여 다음

public interface IJSONSerializable{ 
    public String getSerializedForm(); 
} 

그리고 내 생각에 당신의 최선의 방법은 점점 JSON에 대한 인터페이스를 생성하고이 JSON에 당신이 직렬화 원하는 객체를 구현하는이 인터페이스를하는 것입니다) ObjectOutputStream은 객체를 바이너리로 직렬화하는 데 사용되며 JSON을 기본적으로 지원하지 않습니다.

다른 생각

당신이 이러한 속성과 값으로 물건을 작성하기위한 헬퍼 클래스를 쓸 수있는이 길을 갈하도록 선택하는 경우.

1

이 형식은 계층 (네트워크상의 분산 된 개체에 대한 작업)간에 통신을 유지하는 데 사용되므로 사용자가해야한다고 생각합니다. 할 수있는 일은 예쁜 형식을 사용하여 파일에 객체를 저장하는 핸들러를 만드는 것입니다.

+0

그는 왜하지 않아야하나요? 가장 효율적인 전송은 아닙니다 (그러나 둘 다 기본 Java 직렬화입니다). 그러나 웹에서 자주 사용되므로 문제가 많지 않습니다. 그가 올바르게 작동하는 한, 전송 될 때 데이터가 어떻게 보이는지는별로 흥미롭지 않습니다. – Voo

0

Java 자체에는 JSON 직렬화에 대한 지원 기능이 기본적으로 내장되어 있지 않지만, 그렇게 할 수있는 프레임 워크를 찾을 수있을 것입니다. 또는 간단한 클래스 용으로 직접 작성할 수도 있습니다.

그래서 당신은 JSON 형식으로 직렬화하려는 클래스 만 덮어

private void writeObject(java.io.ObjectOutputStream out) 
    throws IOException 
private void readObject(java.io.ObjectInputStream in) 
    throws IOException, ClassNotFoundException; 

문자열 형식과 그 당신에게 하나 개의 인스턴스의 데이터를 제공 거기에 몇 가지 JSON 프레임 워크가 있다면 너무 열심히해야하지 그 반대.

1

개체를 Externalizable으로 구현하고 직렬화를 완벽하게 제어 할 수 있습니다. 예 : readExternal/writeExternal 메소드를 구현할 때 JSON 용 google-gson

1

, 나는 당신이 Externalizable 인터페이스를 구현 및 방법의 구현

public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException

public void writeExternal(ObjectOutput out) throws IOException

을 제공하는 것이 좋습니다 것입니다 그것의 전적으로 여러분에게 달려 이 경우 직렬화하는 방법.

관련 문제