문제

나이:

class MyClass extends MyClass2 implements Serializable {
  //...
}

에 MyClass2 는 제공하지 않은 직렬화.나는 어떻게 직렬화(및 de-직렬화)이십니까?

교정:MyClass2 은 물론,아니 인터페이스를 가지고 있지만 클래스입니다.

도움이 되었습니까?

해결책

다른 사람으로 주목,제 11 장의 조쉬 블로흐의 효과적인 자바 필수적인 리소스에 Java Serialization.

몇 가지 점에서 그 장의 관련 질문:

  • 고 가정하고 당신이 원하는 직렬화하의 국가 non-직렬화 분야에서 MyClass2,는 필드 액세스할 수 있어야 합 MyClass 직접 또는현.MyClass 구현해야 합니다 사용자 지정 직렬화를 제공하여 readObject 및 writeObject 방법이 있습니다.
  • non-직렬화 분야의 클래스가 있어야 합 API 을 허용하는 그것을 얻기의 상태(에 쓰기에 대한 개체 스트림)및 인스턴스화하는 새 인스턴스와 함께하는 상태인 경우(나중에 읽고 물체에서 stream.)
  • 당 항목 74 의 효과적인 Java,MyClass2 없 arg 생성자에 액세스할 수 있 MyClass,그렇지 않으면 불가능한 MyClass 을 확장하 MyClass2 고 구현하는 직렬화.

내가 쓴 아래 간단한 예제를 설명한다.


class MyClass extends MyClass2 implements Serializable{

  public MyClass(int quantity) {
    setNonSerializableProperty(new NonSerializableClass(quantity));
  }

  private void writeObject(java.io.ObjectOutputStream out)
  throws IOException{
    // note, here we don't need out.defaultWriteObject(); because
    // MyClass has no other state to serialize
    out.writeInt(super.getNonSerializableProperty().getQuantity());
  }

  private void readObject(java.io.ObjectInputStream in)
  throws IOException {
    // note, here we don't need in.defaultReadObject();
    // because MyClass has no other state to deserialize
    super.setNonSerializableProperty(new NonSerializableClass(in.readInt()));
  }
}

/* this class must have no-arg constructor accessible to MyClass */
class MyClass2 {

  /* this property must be gettable/settable by MyClass.  It cannot be final, therefore. */
  private NonSerializableClass nonSerializableProperty;

  public void setNonSerializableProperty(NonSerializableClass nonSerializableProperty) {
    this.nonSerializableProperty = nonSerializableProperty;
  }

  public NonSerializableClass getNonSerializableProperty() {
    return nonSerializableProperty;
  }
}

class NonSerializableClass{

  private final int quantity;

  public NonSerializableClass(int quantity){
    this.quantity = quantity;
  }

  public int getQuantity() {
    return quantity;
  }
}

다른 팁

MyClass2 은 그냥 인터페이스 techinicaly 속성이 없으며,단지 방법이 있습니다.는 말이 있는 경우스 변수는 자신이하지 않 serializeable 내가 아는 유일한 방법이의 주위에 얻을 선언하는 사람들 필드를 일시적이다.

ex:

private transient Foo foo;

를 선언할 때 필드 일시적인 것은 무시 동안 직렬화를 진행 과정입니다.유지되는 경우에 당신은 직렬화하는 개체는 일시적인 필드는 필드의 값은 항상 그것은 기본(일반적으로 null 입니다.)

참고 재정의할 수도 있습니다 readResolve()메서드의 클래스에서 초기화하기 위해 일시적인 분야에 따라 다른 시스템에 상태가 됩니다.

가능한 경우,비 serialiable 부분으로 설정할 수 있습니다 과도

private transient SomeClass myClz;

그렇지 않으면 사용할 수 있는 Kryo.Kryo 빠르고 효율적인 개체를 그래프로 직렬화를 위한 프레임워크 Java(예:JAVA 의 직렬화 java.awt.색상 필요 170 바이트를,Kryo 만 4 개의 바이트),할 수 있는 직렬화하도 직렬화 개체입니다.Kryo 도 수행할 수 있습니다 자동적인 깊고 얕은/복사이 됩니다.이것은 직접 복사를 객체에서 객체지 object->bytes->object.

여기에 사용하는 방법 예 kryo

Kryo kryo = new Kryo();
// #### Store to disk...
Output output = new Output(new FileOutputStream("file.bin"));
SomeClass someObject = ...
kryo.writeObject(output, someObject);
output.close();
// ### Restore from disk...
Input input = new Input(new FileInputStream("file.bin"));
SomeClass someObject = kryo.readObject(input, SomeClass.class);
input.close();

직렬화 개체할 수 있도 압축된 등록 정확한 serializer:

kryo.register(SomeObject.class, new DeflateCompressor(new FieldSerializer(kryo, SomeObject.class)));

는 경우 수정할 수 있습니다 MyClass2,을 해결하는 가장 쉬운 방법은 이 선언을 제공 일시적이다.

당신이해야를 구현하는 writeObject()readObject() 고 설명서 직렬화/직렬화의 필드가 있습니다.보 javadoc 페이지 java.io.Serializable 자세한 내용은.조쉬 블로흐의 효과적인 자바 또한 몇 가지 좋은 장에서 구현하는 강력하고 안전한 직렬화.

따라 달라집 이유는 회원의 MyClass2 없는 직렬화.

이 있는 경우 몇 가지 좋은 이유 MyClass2 로 나타낼 수 없는 직렬화된 형태로,다음 기회는 좋은 동일한 이유로 적용됩 MyClass 때문에,그것의 하위 클래스.

그것이 가능할 수 있을 쓰는 사용자 정의 직렬화된 형태에 대한 MyClass 을 구현하여 readObject 및 writeObject,그런 방법으로 상태의 MyClass2 인스턴스에서 데이터 MyClass 수 있는 적절하게 다시 만들어서 직렬화된 데이터입니다.이 방법을 이동하는 경우 MyClass2 의 API 를 조정과할 수 없습니다 추가 직렬화.

하지만 먼저 파악하고 있어야 왜 MyClass2 없는 직렬화,그리고 어쩌면 그것을 변경합니다.

당신은 시작할 수 있으로 보고 과도 키워드는 필드 표시하지 않는 부분의 지속적인 국가의 개체입니다.

여러 가지 가능성을 밖으로 꺼내고 나는 그들을 다시 시작 여기:

  • 구현 writeObject()및 readObject()로 sk
  • 선포하는 시설은 과도 및 수 없는 직렬화로 먼저에 의해 명시 hank
  • 사용 XStream 에 의해 명시된 바와 같이 boris-terzic
  • 사용 직렬 프록시가 명시 톰-의미-tackline

XStream 은 라이브러리에 대한 빠른 일 Java XML 직렬화를 위해 모든 개체는 경우에 상관없이 그것은 가능 또는하지 않습니다.는 경우에도 XML 형식으로 대상에 적합하지 않는 당신,당신이 할 수 있는 소스 코드를 사용하는 방법을 배우 그것을 할 수 있습니다.

유용한 접근 방식어를 추가하기 위해 인스턴스가 아닌 클래스는 직렬화(또는 적어도 하위 클래스)는 잘 알려진 연쇄 프록시합니다.기본적으로 구현하 writeReplace 를 반환하의 인스턴스는 완전히 다른 직렬화를 구현하고 있는 클래스는 readResolve 복사본을 반환의 원래 개체입니다.내가 쓴의 예를 들어를 추가하 java.awt.BasicStroke 에 Usenet

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top