2절: 유형을 서열화할 수 있도록 한다

4226 단어 서열화
하나의 유형을 설계할 때, 디자이너는 반드시 유형의 실례 서열화를 허용할지 여부를 정중하게 결정해야 한다.형식은 기본적으로 서열화할 수 없습니다.예를 들어, 다음 코드는 원하는 대로 작동하지 않을 수 있습니다.
 
internal struct Point { public Int32 x, y;}

private static void OptInSerialization()

        {

            Point pt = new Point { x = 1, y = 2 };

            using (var stream = new MemoryStream())

            {



                new BinaryFormatter().Serialize(stream, pt);//   SerializationException

            }

        }

프로그램에서 상기 코드를 생성하고 실행하면 포맷기의 Serialize 방법이 이상을 던지는 것을 발견할 수 있습니다.문제는 Point 유형의 개발자가 표시하지 않은 Point 대상을 서열화할 수 있다는 점이다.이 문제를 해결하기 위해서 개발자는 다음과 같이 이 유형에 시스템이라는 이름을 적용해야 한다.Serializable Attribute의 사용자 정의 attribute입니다.(이attribute는 System 이름 공간에서 정의된 것이지 System.Runtime.serialization 이름 공간에서 정의된 것이 아닙니다.)
[Serializable]

internal struct Point { public Int32 x, y;}

현재 실행 프로그램을 다시 생성하고 실행하면 예상대로 작동하고 Point 대상은 흐름에 순조롭게 서열화됩니다.하나의 대상 그림을 서열화할 때 포맷기는 모든 대상의 유형이 서열화될 수 있는지 검사합니다.대상 그림의 모든 대상을 서열화할 수 없으면 포맷기의 Serialize 방법은 SerializationException 이상을 던집니다.
 
주의: 하나의 대상 그림을 서열화할 때, 어떤 대상의 유형은 서열화될 수도 있고, 어떤 대상은 안 될 수도 있습니다.성능을 고려하여 서열화하기 전에 포맷기는 대상 그림의 모든 대상을 서열화할 수 있는지 검증하지 않습니다.따라서 하나의 대상 그림을 서열화할 때 SerializationException을 던지기 전에 일부 대상이 이미 흐름에 서열화되었을 가능성이 높다.만약 이런 상황이 발생한다면, 흐름에는 손상된 데이터가 포함될 것이다.대상을 서열화할 때만약 일부 대상이 서열화되지 못할 수도 있다고 생각한다면, 코드를 쓰면 이러한 이상에서 제대로 회복될 수 있어야 한다.하나의 시나리오는 먼저 객체를 Memory Stream에 서열화하는 것입니다.그리고 모든 대상이 서열화되면, Memory Stream의 바이트를 당신이 진정으로 원하는 목표 흐름 (예를 들어 파일과 네트워크) 으로 복사할 수 있습니다.
이 맞춤형 attribute는 인용 형식 (class), 값 형식 (struct), 매거 형식 (enum), 의뢰 (delegate) 에만 적용됩니다.매거진과 의뢰 형식은 항상 서열화될 수 있기 때문에 Serializable Attribute를 적용할 필요가 없습니다.이외에도 Serializable Attribute는 파생적으로 상속되지 않습니다.따라서 다음 두 가지 유형의 정의를 지정하면 Person 객체는 시리얼화되고 Employee 객체는 시리얼화되지 않습니다.
  [Serializable]
  class Person { } internal class Employee : Person { }

이 문제를 해결하려면 Employee 유형에 Serializable Attribute를 적용하십시오.
[Serializable]

    internal class Person { }

    [Serializable]

    internal class Employee : Person

    { 

    }

상소 문제는 수정하기 쉬우나 반대로 그렇지 않다는 점에 주의해라.만약 하나의 유형이 Serializable Attribute를 사용하지 않는다면, 어떻게 그것에서 서열화된 유형을 파생시킬 수 있는지 상상하기 어렵다.그러나 이렇게 설계할 때 이유가 있다. 만약에 기류가 그의 실례 서열화를 허락하지 않는다면 그의 필드는 서열화할 수 없다. 왜냐하면 기류는 실제 파생 대상의 일부이기 때문이다.이것이 바로 왜 시스템인가.Object는 Serializable Attribute의 원인을 자상하게 적용했습니다.
 
주의: 일반적으로 당신이 정의한 대부분의 유형은 서열화로 설정하는 것을 권장합니다. 왜냐하면 이것은 유형의 사용자에게 매우 큰 유연성을 제공할 수 있기 때문입니다.그러나 이 필드가public,protected,internal,private로 성명되든지 상관없이 서열화는 한 대상의 모든 필드를 읽을 수 있음을 주의해야 한다.만약 하나의 유형의 실례가 민감하고 안전한 데이터를 포괄하거나 데이터가 이동한 후에 의미가 없거나 값이 없으면 유형을 서열화해서는 안 된다.
 
만약 사용한 유형이 서열화를 위한 것이 아니라, 수중에 형식의 원본 코드가 없다면, 원본 코드에서 서열화 지원을 추가할 수 없습니다.뒤에 있는 '반서열화 대상 시 프로그램 집합과/형식 다시 쓰기' 에서, 나는 서열화할 수 없는 모든 형식을 서열화할 수 있는 방법을 설명할 것이다.

좋은 웹페이지 즐겨찾기