Java 시리얼화된 요약(최대)
콘셉트
시리얼화된 ID
,
private static final long serialVersionUID = 1L; //
private static final long serialVersionUID = -5453781658505116230L; //
정적 변수 서열화
부모 클래스 서열화 및 Trancient 키워드
PutField getPutField 필드를 사용한 암호화
원리:
private void writeObject(ObjectOutputStream out) {
try {
PutField putFields = out.putFields(); //
System.out.println(" :" + password);
password = "encryption";//
putFields.put("password", password);
System.out.println(" " + password);
out.writeFields();
} catch (IOException e) {
e.printStackTrace();
}
}
private void readObject(ObjectInputStream in) {
try {
GetField readFields = in.readFields();
Object object = readFields.get("password", "");
System.out.println(" :" + object.toString());
password = "pass";// ,
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// out writeObject(), in readObject()
시리얼화된 스토리지 규칙
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("result.obj")); Test test = new Test(); test.i = ;//유효한 out.writeObject(test); out.flush(); test.i = ;//무효 두 번째 반서열화는 대상의 인용 관계만 같은 인용 대상으로 표시하고 디스크 공간out을 절약합니다.writeObject(test); out.close(); ObjectInputStream oin = new ObjectInputStream(new FileInputStream( "result.obj")); Test t = (Test) oin.readObject(); Test t = (Test) oin.readObject(); System.out.println(t.i);//System.out.println(t.i);//
Serializable 인터페이스의 정의:
public interface Serializable {} // , JVM , ! ?
태그의 특정 정의 영역:
writeObject0 메서드에는 다음과 같은 코드가 있습니다.
if (obj instanceof String) {
2 writeString((String) obj, unshared);
3 } else if (cl.isArray()) {
4 writeArray(obj, desc, unshared);
5 } else if (obj instanceof Enum) {
6 writeEnum((Enum>) obj, desc, unshared);
7 } else if (obj instanceof Serializable) {
8 writeOrdinaryObject(obj, desc, unshared);
9 } else {
10 if (extendedDebugInfo) {
11 throw new NotSerializableException(
12 cl.getName() + "/n" + debugInfoStack.toString());
13 } else {
14 throw new NotSerializableException(cl.getName());
15 }
16 }
이를 통해 알 수 있듯이 서열화 작업을 할 때 서열화될 클래스가 Enum, Array, Serializable 유형인지 판단하고, 그렇지 않으면 NotSerializable Exception을 던집니다.
ArrayList 분석
구체적 분석:
ArrayList에서 writeObject와readObject 방법을 정의했습니다
private void readObject(java.io.ObjectInputStream s)
2 throws java.io.IOException, ClassNotFoundException {
3 elementData = EMPTY_ELEMENTDATA;
4 // Read in size, and any hidden stuff
5 s.defaultReadObject();
6 // Read in capacity
7 s.readInt(); // ignored
8 if (size > 0) {
9 // be like clone(), allocate array based upon size not capacity
10 ensureCapacityInternal(size);
11 Object[] a = elementData;
12 // Read in all elements in the proper order.
13 for (int i=0; i) {
14 a[i] = s.readObject();
15 }
16 }
17 }
private void writeObject(java.io.ObjectOutputStream s)
2 throws java.io.IOException{
3 // Write out element count, and any hidden stuff
4 int expectedModCount = modCount;
5 s.defaultWriteObject();
6 // Write out size as capacity for behavioural compatibility with clone()
7 s.writeInt(size);
8 // Write out all elements in the proper order.
9 for (int i=0; i) {
10 s.writeObject(elementData[i]);
11 }
12 if (modCount != expectedModCount) {
13 throw new ConcurrentModificationException();
14 }
15 }
요약사용자 정의 서열화 및 반서열화 정책을 writeObject와readObject 방법으로 다시 쓰는 방법
이 두 가지 방법은 어떻게 호출되었습니까?
void invokeWriteObject(Object obj, ObjectOutputStream out)
2 throws IOException, UnsupportedOperationException
3 {
4 if (writeObjectMethod != null) {
5 try {
6 writeObjectMethod.invoke(obj, new Object[]{ out });
7 } catch (InvocationTargetException ex) {
8 Throwable th = ex.getTargetException();
9 if (th instanceof IOException) {
10 throw (IOException) th;
11 } else {
12 throwMiscException(th);
13 }
14 } catch (IllegalAccessException ex) {
15 // should not occur, as access checks have been suppressed
16 throw new InternalError(ex);
17 }
18 } else {
19 throw new UnsupportedOperationException();
20 }
21 }
여기서 writeObjectMethod.invoke(obj, new Object[]{ out }); 관건입니다. 반사하는 방식으로 writeObjectMethod 방법을 호출합니다.공식적으로는 이 write Object Method를 이렇게 설명한다.
class-defined writeObject method, or null if none
우리의 예에서, 이 방법은 바로 우리가 Array List에서 정의한 write Object 방법이다.반사 방식을 통해 호출되었다
그럼 어떻게 반사되는 거예요?
Object StreamClass 이 방법에는 다음과 같은 코드가 있습니다:read Object Method read Object NoData Method는
if (externalizable) {
cons = getExternalizableConstructor(cl);
} else {
cons = getSerializableConstructor(cl);
writeObjectMethod = getPrivateMethod(cl, "writeObject",
new Class>[] { ObjectOutputStream.class },
Void.TYPE);
readObjectMethod = getPrivateMethod(cl, "readObject",
new Class>[] { ObjectInputStream.class },
Void.TYPE);
readObjectNoDataMethod = getPrivateMethod(
cl, "readObjectNoData", null, Void.TYPE);
hasWriteObjectData = (writeObjectMethod != null);
}
domains = getProtectionDomains(cons, cl);
writeReplaceMethod = getInheritableMethod(
cl, "writeReplace", null, Object.class);
readResolveMethod = getInheritableMethod(
cl, "readResolve", null, Object.class);
return null;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.