ISerializable 인터페이스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
클래스의 직렬화 가능성은 java를 구현하는 클래스에 의해 활성화됩니다.
[Android.Runtime.Register("java/io/Serializable", "", "Java.IO.ISerializableInvoker")]
public interface ISerializable : Android.Runtime.IJavaObject, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/io/Serializable", "", "Java.IO.ISerializableInvoker")>]
type ISerializable = interface
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- 파생
- 특성
- 구현
설명
클래스의 직렬화 가능성은 java.io.Serializable 인터페이스를 구현하는 클래스에 의해 활성화됩니다.
<강력한>경고: 신뢰할 수 없는 데이터의 역직렬화는 본질적으로 위험하며 피해야 합니다. 신뢰할 수 없는 데이터의 유효성을 신중하게 검사해야 합니다. </strong>
이 인터페이스를 구현하지 않는 클래스에는 직렬화되거나 역직렬화된 상태가 없습니다. 직렬화 가능한 클래스의 모든 하위 형식은 직렬화할 수 있습니다. serialization 인터페이스에는 메서드나 필드가 없으며 직렬화할 수 있는 의미 체계를 식별하는 데만 사용됩니다.
직렬화할 수 없는 클래스의 하위 형식을 직렬화할 수 있도록 하위 형식은 상위 형식의 public, protected 및 (액세스 가능한 경우) 패키지 필드의 상태를 저장하고 복원하는 책임을 맡을 수 있습니다. 하위 형식은 확장되는 클래스에 클래스의 상태를 초기화하는 액세스 가능한 no-arg 생성자가 있는 경우에만 이 책임을 맡을 수 있습니다. 그렇지 않은 경우 Serializable 클래스를 선언하는 것은 오류입니다. 런타임에 오류가 검색됩니다.
역직렬화하는 동안 직렬화할 수 없는 클래스의 필드는 클래스의 public 또는 protected no-arg 생성자를 사용하여 초기화됩니다. 직렬화할 수 있는 서브클래스에는 no-arg 생성자에 액세스할 수 있어야 합니다. serialize할 수 있는 서브클래스의 필드는 스트림에서 복원됩니다.
그래프를 트래버스할 때 Serializable 인터페이스를 지원하지 않는 개체가 발생할 수 있습니다. 이 경우 NotSerializableException이 throw되고 직렬화할 수 없는 개체의 클래스를 식별합니다.
serialization 및 deserialization 프로세스 중에 특수 처리가 필요한 클래스는 다음과 같은 정확한 서명을 사용하여 특수 메서드를 구현해야 합니다.
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;
writeObject 메서드는 해당 readObject 메서드가 복원할 수 있도록 특정 클래스에 대한 개체의 상태를 작성합니다. 개체의 필드를 저장하는 기본 메커니즘은 out.defaultWriteObject를 호출하여 호출할 수 있습니다. 이 메서드는 슈퍼클래스 또는 서브클래스에 속하는 상태와 관련이 없습니다. 상태는 writeObject 메서드를 사용하거나 DataOutput에서 지원하는 기본 데이터 형식에 대한 메서드를 사용하여 ObjectOutputStream에 개별 필드를 작성하여 저장됩니다.
readObject 메서드는 스트림에서 읽고 클래스 필드를 복원하는 역할을 담당합니다. in.defaultReadObject를 호출하여 개체의 비정적 및 비정적 필드를 복원하기 위한 기본 메커니즘을 호출할 수 있습니다. defaultReadObject 메서드는 스트림의 정보를 사용하여 스트림에 저장된 개체의 필드를 현재 개체의 해당 명명된 필드와 할당합니다. 새 필드를 추가하기 위해 클래스가 발전한 경우를 처리합니다. 이 메서드는 슈퍼클래스 또는 서브클래스에 속하는 상태와 관련이 없습니다. 개별 필드의 ObjectInputStream에서 데이터를 읽고 개체의 적절한 필드에 할당하여 상태를 복원합니다. 기본 데이터 형식 읽기는 DataInput에서 지원됩니다.
readObjectNoData 메서드는 serialization 스트림이 역직렬화되는 개체의 슈퍼 클래스로 지정된 클래스를 나열하지 않는 경우 특정 클래스에 대한 개체의 상태를 초기화합니다. 수신 당사자가 보내는 파티와 다른 버전의 역직렬화된 인스턴스 클래스를 사용하고 받는 사람의 버전이 보낸 사람의 버전으로 확장되지 않은 클래스를 확장하는 경우에 발생할 수 있습니다. serialization 스트림이 변조된 경우에도 발생할 수 있습니다. 따라서 readObjectNoData는 "적대적" 또는 불완전한 소스 스트림에도 불구하고 역직렬화된 개체를 제대로 초기화하는 데 유용합니다.
스트림에 개체를 쓸 때 사용할 대체 개체를 지정해야 하는 직렬화 가능 클래스는 정확한 시그니처를 사용하여 이 특수 메서드를 구현해야 합니다.
ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;
이 writeReplace 메서드는 메서드가 있는 경우 serialization에 의해 호출되며 serialize되는 개체의 클래스 내에 정의된 메서드에서 액세스할 수 있습니다. 따라서 메서드는 프라이빗, 보호 및 패키지-프라이빗 액세스를 가질 수 있습니다. 이 메서드에 대한 서브클래스 액세스는 Java 접근성 규칙을 따릅니다.
스트림에서 인스턴스를 읽을 때 대체를 지정해야 하는 클래스는 정확한 서명을 사용하여 이 특수 메서드를 구현해야 합니다.
ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
이 readResolve 메서드는 writeReplace와 동일한 호출 규칙 및 접근성 규칙을 따릅니다.
serialization 런타임은 직렬화할 수 있는 각 클래스와 직렬화할 수 있는 버전 번호를 연결합니다. serialVersionUID는 역직렬화 중에 serialize된 개체의 보낸 사람과 수신자가 serialization과 호환되는 해당 개체에 대한 클래스를 로드했는지 확인하는 데 사용됩니다. 수신기가 해당 보낸 사람의 클래스와 다른 serialVersionUID가 있는 개체에 대한 클래스를 로드한 경우 역직렬화가 발생 InvalidClassException
합니다. serializable 클래스는 정적, 최종 및 형식long
이어야 하는 필드를 "serialVersionUID"
선언하여 자체 serialVersionUID를 명시적으로 선언할 수 있습니다.
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
serialize 가능 클래스가 serialVersionUID를 명시적으로 선언하지 않는 경우 serialization 런타임은 Java(TM) 개체 Serialization 사양에 설명된 대로 클래스의 다양한 측면을 기반으로 해당 클래스에 대한 기본 serialVersionUID 값을 계산합니다. 그러나 기본 serialVersionUID 계산은 <>컴파일러 구현에 따라 달라질 수 있는 클래스 세부 정보에 매우 민감하므로 역직렬화하는 동안 예기치 않은 InvalidClassException
결과가 발생할 수 있으므로 모든 직렬화 가능 클래스가 serialVersionUID 값을 명시적으로 선언하는 것이 좋습니다<>. 따라서 서로 다른 Java 컴파일러 구현에서 일관된 serialVersionUID 값을 보장하려면 직렬화 가능한 클래스가 명시적 serialVersionUID 값을 선언해야 합니다. 또한 명시적 serialVersionUID 선언은 가능한 경우 한정자를 사용하는 private
것이 좋습니다. 이러한 선언은 즉시 선언하는 클래스에만 적용되므로 serialVersionUID 필드는 상속된 멤버로 유용하지 않습니다. 배열 클래스는 명시적 serialVersionUID를 선언할 수 없으므로 항상 기본 계산 값이 있지만 배열 클래스에 대해 serialVersionUID 값 일치에 대한 요구 사항은 면제됩니다.
android N을 대상으로 하는 경우 일부 클래스에 대해 serialVersionUID 계산의 Android 구현이 약간 변경됩니다. 호환성을 유지하기 위해 이 변경은 애플리케이션 대상 SDK 버전이 24 이상으로 설정된 경우에만 사용하도록 설정됩니다. 호환성 문제를 방지하려면 명시적 serialVersionUID 필드를 사용하는 것이 좋습니다.
<h3>Serializable Judiciously</h3> 구현 serialization API의 철저한 검사에 대한 serialization에 대한 유효 Java의 장을 참조하세요. 이 책에서는 애플리케이션의 유지 관리 효율성에 해를 끼치지 않고 이 인터페이스를 사용하는 방법을 설명합니다.
<h3>권장 대안</h3<>강력한>JSON</strong>은 간결하고 사람이 읽을 수 있으며 효율적입니다. Android에는 JSON을 android.util.JsonReader streaming API
읽고 쓰는 A와 org.json.JSONObject tree API
A가 모두 포함됩니다. GSON과 같은 바인딩 라이브러리를 사용하여 Java 개체를 직접 읽고 씁니다.
1.1에 추가되었습니다.
에 대한 java.io.Serializable
Java 설명서
이 페이지의 일부는 Android 오픈 소스 프로젝트에서 만들고 공유하고 Creative Commons 2.5 특성 라이선스에 설명된 용어에 따라 사용되는 작업을 기반으로 하는 수정 사항입니다.
속성
Handle |
기본 Android 개체의 JNI 값을 가져옵니다. (다음에서 상속됨 IJavaObject) |
JniIdentityHashCode |
래핑된 인스턴스의 |
JniManagedPeerState |
관리되는 피어의 상태입니다. (다음에서 상속됨 IJavaPeerable) |
JniPeerMembers |
멤버 액세스 및 호출 지원. (다음에서 상속됨 IJavaPeerable) |
PeerReference |
JniObjectReference 래핑된 Java 개체 인스턴스의 값을 반환합니다. (다음에서 상속됨 IJavaPeerable) |
메서드
Disposed() |
인스턴스가 삭제되었을 때 호출됩니다. (다음에서 상속됨 IJavaPeerable) |
DisposeUnlessReferenced() |
이 인스턴스에 대한 미해결 참조가 없으면 호출 |
Finalized() |
인스턴스가 종료될 때 호출됩니다. (다음에서 상속됨 IJavaPeerable) |
SetJniIdentityHashCode(Int32) |
에서 반환 |
SetJniManagedPeerState(JniManagedPeerStates) |
클래스의 직렬화 가능성은 java를 구현하는 클래스에 의해 활성화됩니다. (다음에서 상속됨 IJavaPeerable) |
SetPeerReference(JniObjectReference) |
에서 반환 |
UnregisterFromRuntime() |
런타임이 이후 Java.Interop.JniRuntime+JniValueManager.PeekValue 호출에서 반환되지 않도록 이 인스턴스의 등록을 취소합니다. (다음에서 상속됨 IJavaPeerable) |
확장 메서드
JavaCast<TResult>(IJavaObject) |
Android 런타임 확인 형식 변환을 수행합니다. |
JavaCast<TResult>(IJavaObject) |
클래스의 직렬화 가능성은 java를 구현하는 클래스에 의해 활성화됩니다. |
GetJniTypeName(IJavaPeerable) |
클래스의 직렬화 가능성은 java를 구현하는 클래스에 의해 활성화됩니다. |