JavaTM 2 Platform
Standard Ed. 5.0

java.io
인터페이스 Serializable

알려진 서브 인터페이스 목록 :
AdapterActivator, Attribute, Attribute, Attributes, BindingIterator, ClientRequestInfo, ClientRequestInterceptor, Codec, CodecFactory, Control, Current, Current, Current, CustomValue, DataInputStream, DataOutputStream, Descriptor, DHPrivateKey, DHPublicKey, DocAttribute, DomainManager, DSAPrivateKey, DSAPublicKey, DynAny, DynAnyFactory, DynArray, DynEnum, DynFixed, DynSequence, DynStruct, DynUnion, DynValue, DynValueBox, DynValueCommon, ECPrivateKey, ECPublicKey, ExtendedRequest, ExtendedResponse, Externalizable, IdAssignmentPolicy, IDLEntity, IDLType, IdUniquenessPolicy, ImplicitActivationPolicy, Interceptor, IORInfo, IORInterceptor, IORInterceptor_3_0, IRObject, Key, LifespanPolicy, Name, NamingContext, NamingContextExt, NotificationFilter, ObjectReferenceFactory, ObjectReferenceTemplate, ORBInitializer, ORBInitInfo, PBEKey, POA, POAManager, Policy, PolicyFactory, PrintJobAttribute, PrintRequestAttribute, PrintServiceAttribute, PrivateKey, PublicKey, QueryExp, RelationType, RemoteRef, RequestInfo, RequestProcessingPolicy, RSAMultiPrimePrivateCrtKey, RSAPrivateCrtKey, RSAPrivateKey, RSAPublicKey, RunTime, SecretKey, ServantActivator, ServantLocator, ServantManager, ServantRetentionPolicy, ServerRef, ServerRequestInfo, ServerRequestInterceptor, StreamableValue, SupportedValuesAttribute, ThreadPolicy, UnsolicitedNotification, ValueBase, ValueExp

public interface Serializable

클래스의 직렬화 가능성은 java.io.Serializable 인터페이스를 구현한 클래스에 의해 유효하게 됩니다. 이 인터페이스를 구현하고 있지 않는 클래스에서는 그 상태가 직렬화 또는 직렬화 복원될 것은 없습니다. 직렬화 가능 클래스의 아류형은 모두 그 자체가 직렬화 가능합니다. 직렬화 인터페이스에는 메서드나 필드는 없고, 직렬화 가능한 것을 식별하기 위해인 만큼 기능합니다.

비직렬화 가능 클래스의 아류형을 직렬화 가능하게 하기 위한, 아류형에서는 슈퍼타입의 public 필드, protected 필드 및 (액세스 가능하면) package 필드 상태를 보존하거나 복원하거나 할 책임을 상정할 수 있습니다. 다만, 아류형으로 이 책임을 상정할 수 있는 것은 그것이 확장하는 클래스에 클래스 상태를 초기화하기 위한 액세스 가능한 인수 없음의 생성자가 있는 경우만입니다. 생성자가 없는 경우는 Serializable 클래스를 선언하면 에러가 됩니다. 에러는 실행시에 검출됩니다.

직렬화 복원때는 비직렬화 가능 클래스의 필드는 그 클래스의 public 또는 protected 인수 없음의 생성자를 사용해 초기화됩니다. 인수 없음의 생성자는 직렬화 가능 서브 클래스로부터 액세스 가능하지 않으면 안됩니다. 직렬화 가능 서브 클래스의 필드는 스트림로부터 복원됩니다.

객체 그래프의 순회중에 직렬화 가능 인터페이스를 지원 하고 있지 않을 가능성이 있는 객체에 조우하는 일이 있습니다. 이 경우는 NotSerializableException가 Throw 되어 비직렬화 가능 객체의 클래스를 식별합니다.

직렬화와 직렬화 복원 시에 특수한 취급이 필요한 클래스에서는 정확하게 다음과 같은 시그니쳐를 가지는 특수한 메서드를 구현할 필요가 있습니다.

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

writeObject 메서드에서는 그 개개의 클래스의 객체 상태를 출력할 책임이 있어, 대응하는 readObject 메서드로 복원할 수 있게 됩니다. out.defaultWriteObject를 호출하면, 객체의 필드를 보존하기 위한 디폴트의 도구를 호출할 수 있습니다 . 그 메서드 자신은 그 슈퍼 클래스 또는 서브 클래스에 속하는 상태에 관여할 필요는 없습니다. 상태를 보존하려면, writeObject 메서드를 사용해 개개의 필드를 ObjectOutputStream에 출력하는지, 또는 DataOutput 로 지원하는 단순한 데이터 타입용의 메서드를 사용합니다.

readObject 메서드는 스트림로부터 읽기 클래스의 필드를 복원할 책임이 있습니다. in.defaultReadObject 메서드를 호출해, 그 객체의 비 static 필드 및 비 transient 필드를 복원하기 위한 디폴트의 도구를 호출할 수 있습니다 . defaultReadObject 메서드는 스트림의 정보를 사용해, 현재의 객체내의 대응하는 이름을 붙일 수 있었던 필드에서 스트림에 보존된 객체의 필드를 지정합니다. 이 메서드는 새로운 필드를 추가하기 위해서 클래스가 전개되는 경우를 취급합니다. 이 메서드 자신은 그 슈퍼 클래스 또는 서브 클래스에 속하는 상태에 그것 자신이 관여할 필요는 없습니다. 상태는 writeObject 메서드를 사용해 개개의 필드를 ObjectOutputStream에 출력하는지, 또는 DataOutput 로 지원하는 기본 데이터형용의 메서드를 사용하는 것으로 저장합니다.

스트림에 객체를 출력할 때 사용하는 대체 객체를 지정할 필요가 있는 직렬화 가능 클래스에서는 다음의 시그니쳐를 정확하게 지정해, 이 특별한 메서드를 구현할 필요가 있습니다.

 ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException; 

이 writeReplace 메서드가 존재하는 경우는 직렬화로 이 메서드가 호출됩니다. 또, 이 메서드는 직렬화 되는 객체의 클래스내에서 정의되고 있는 메서드로부터 액세스 할 수 있습니다. 그 때문에 이 메서드에서는 private, protected 및 package-private 로 액세스 할 수 있습니다 . 이 메서드에 대한 서브 클래스의 액세스에 대해서는 java 액세스 가능성 규칙에 준거합니다.

대체 객체의 인스턴스를 스트림로부터 읽어들일 때 그 객체를 지정할 필요가 있는 클래스에서는 다음의 시그니쳐를 정확하게 지정해, 이 특별한 메서드를 구현할 필요가 있습니다.

 ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException; 

이 readResolve 메서드는 writeReplace와 같은 호출해 규칙과 액세스 가능성 규칙에 준거합니다.

직렬화 런타임은 직렬화 가능 클래스와 버전 번호 (serialVersionUID)를 관련짓습니다. 버전 번호는 직렬화 복원시에 직렬화 객체의 송신측과 수신측이 직렬화 호환성이 있는 이 객체의 클래스를 로드했는지 어떠했는지를 검증하기 위해서 사용됩니다. 수신측이 송신측의 클래스와 serialVersionUID가 다른 객체의 클래스를 로드했을 경우, 직렬화 복원의 결과는 InvalidClassException이 됩니다. 직렬화 가능 클래스는 독자적인 serialVersionUID를 명시적으로 선언할 수 있습니다. 이 때문에는 static 또한 final long 형 필드 「serialVersionUID」를 선언합니다.

 ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; 
직렬화 가능 클래스가 명시적으로 serialVersionUID를 선언하지 않는 경우, 직렬화 런타임은 「Java(TM) Object Serialization Specification」에 기술되고 있도록, 다양한 국면에 기반해 그 클래스의 디폴트의 serialVersionUID 치를 계산합니다. 그러나, 디폴트의 serialVersionUID 계산은 클래스의 상세 정보에 크게 좌우되어 이 클래스의 상세 정보는 게다가 컴파일러의 구현 상황에 존하고 있으므로 직렬화 복원시에 예기치 않은 InvalidClassException가 발생할 가능성이 있습니다. 이러한 문제를 막기 위해서도, 모든 직렬화 가능 클래스가 serialVersionUID 치를 명시적으로 선언하도록 설정하는 것을 강하게 추천합니다. Java 컴파일러 구현이 차이가 나도, 항상 일정한 serialVersionUID 치를 얻으려면, 직렬화 가능 클래스가 명시적인 serialVersionUID 치를 선언할 필요가 있습니다. 또, 이 선언에서는 할 수 있는 한 private 수식자를 사용하는 것을 추천합니다. 왜냐하면, 이 선언은 바로 옆의 선언 클래스 밖에 적용되지 않고, serialVersionUID 필드는 상속 멤버로서 사용할 수 없기 때문입니다.

도입된 버전 :
JDK1. 1
관련 항목:
ObjectOutputStream, ObjectInputStream, ObjectOutput, ObjectInput, Externalizable


JavaTM 2 Platform
Standard Ed. 5.0

Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조하십시오.