Unity 시리얼화 및 역시리얼화 프로세스 분석

Unity 시리얼화 및 역시리얼화 프로세스 분석


서열화는 대상을 바이트 흐름으로 바꾸는 과정이다


서열화된 대상은 포맷기 BinaryFormatter의 Serialize 방법을 호출하기만 하면 됩니다.Serialize 방법은 도대체 어떻게 서열화되었을까요?우선 포맷기는 목표 대상의 유형의 메타데이터를 참고하여 서열화할 대상의 정보를 이해한다.구체적으로 말하면 반사 메커니즘을 사용했다.

포맷기 서열화 절차


영웅 Hero를 서열화하는 예를 들면:
[Serializable]
public class Hero{
    int maxHp;
    int currentHp;
    float Attack;
    public Hero(){
        ...
    }
    public void Attack(){
        ...
    }
}

1단계: 대상 객체의 구성원 필드 정보 얻기


먼저 FormatterServices 클래스의 GetSerializable Members 메서드를 호출합니다. 메서드는 다음과 같습니다.
public static MemberInfo[]GetSerializableMembers(
  Type type,
  StreamingContext context
)

유형 Type은 정렬 중인 유형을 나타냅니다. 이 예는 Hero 클래스입니다. 즉, 하나의 클래스의 메타데이터를 가져옵니다.메타데이터는 데이터의 데이터로 이 클래스에 어떤 구성원 변수가 있고 대응하는 유형이 무엇인지를 설명한다. 예를 들어 Hero클래스에는 2개의 int형 구성원 변수와float형 구성원 변수가 있다.
SteamingContext 매개변수는 시리얼화된 컨텍스트를 나타냅니다.
반환 형식은 MemberInfo[]이고 MemberInfo는 서열화할 수 있는 실례 필드입니다. 이 예는 int, int,float입니다.

2단계: 대상 객체의 구성원 필드 값 가져오기


MemberInfo 객체로 구성된 배열을 얻으면 객체가 서열화되는 단계에 들어갑니다.이 때 포맷기는FormatterServices 클래스의 또 다른 정적 방법인 GetObjectData를 호출하려고 합니다. 이 방법의 서명은 다음과 같습니다.
public static Object[]GetObjectData(
  Object obj,
  MemberInfo[]members
)

이 방법은 MemberInfo 그룹의 클래스를 제거한 실례obj에서 대응하는 구성원 변수의 실례를 추출하여 반환값 Object 그룹에 일일이 대응하여 생성한다. 반환값 Object의 모든 변수는 대상obj에 대응하는 구성원 변수의 실례이다.

3단계: 프로그램 집합 표지와 유형의 전체 이름 쓰기 흐름


4단계: 구성원 변수의 값 쓰기 흐름


포맷기는 다음에 첫 번째 단계와 두 번째 단계에서 얻은 두 개의 그룹을 옮겨다니며 구성원의 이름과 그에 대응하는 값을 얻고, 마지막으로 이 정보도 흐름에 기록합니다.

포맷기 반서열화 절차


기본 프로세스와 시리얼화된 프로세스는 다음과 같습니다.
  • 먼저 흐름에서 프로그램 집합 표지와 완전한 유형 이름을 읽는다.
  • 그리고 새로운 대상obj에 메모리 공간을 분배하는데 이때 구조 함수를 호출하지 않았습니다.
  • 앞에서 언급한Formatter 서비스 클래스의GetSerializable Members 방법(보이는 클래스의 구성원 필드의 정보는 흐름에 쓰지 않고 동적으로 얻기)을 다시 한 번 사용하여 Member Info 그룹을 얻는다.
  • 포맷기는 흐름에 포함된 데이터에 따라 Object 배열을 만듭니다.
  • MemberInfo 배열과 Object 배열에 따라 객체 obj를 초기화합니다.

  • 서열화와 반서열화와 프로그램 집합의 관계


    코드가 대상을 서열화할 때, 쓰기 흐름의 내용에는 형식의 전체 이름과 형식 정의 프로그램 집합의 전체 이름도 포함된다.반서열화할 때 포맷기는 프로그램 집합의 표지 정보를 먼저 얻은 다음에 System을 호출합니다.Reflection.Assembly의 Load 메서드는 현재 AppDomain에 대상 프로그램 세트를 로드합니다.프로그램 집합을 불러온 후에만 포맷기는 프로그램에서 반서열화된 대상의 유형 정보를 집중적으로 찾을 수 있습니다.요구에 맞는 유형을 찾으면 그 다음에 이 유형의 실례를 만들고 흐름에서 이 실례 필드와 대응하는 값을 가져와 이 실례의 필드에 값을 부여합니다.

    참고 자료


    Unity 3D 스크립트 프로그래밍 C# 언어로 플랫폼 간 게임 개발 제10장

    좋은 웹페이지 즐겨찾기