다음을 통해 공유


직렬화

비고

이 콘텐츠는 프레임워크 디자인 지침: 재사용 가능한 .NET 라이브러리에 대한 규칙, 관용구 및 패턴, 2판에서 Pearson Education, Inc.의 권한으로 다시 인쇄됩니다. 이 버전은 2008년에 출판되었으며, 이후 세 번째 에디션에서 완전히 수정되었습니다. 이 페이지의 일부 정보는 오래된 것일 수 있습니다.

Serialization은 개체를 쉽게 유지하거나 전송할 수 있는 형식으로 변환하는 프로세스입니다. 예를 들어 개체를 직렬화하고, HTTP를 사용하여 인터넷을 통해 전송하고, 대상 컴퓨터에서 역직렬화할 수 있습니다.

.NET Framework는 다양한 serialization 시나리오에 최적화된 세 가지 주요 serialization 기술을 제공합니다. 다음 표에서는 이러한 기술과 이러한 기술과 관련된 주요 프레임워크 유형을 나열합니다.

기술 이름 기본 형식 시나리오
데이터 계약 직렬화 DataContractAttribute
DataMemberAttribute
DataContractSerializer
NetDataContractSerializer
DataContractJsonSerializer
ISerializable
일반 지속성
웹 서비스
JSON (자바스크립트 객체 표기법)
XML Serialization XmlSerializer XML의 모양을 완전히 제어할 수 있는 XML 형식
런타임 직렬화(이진 및 SOAP) SerializableAttribute
ISerializable
BinaryFormatter
SoapFormatter
.NET 리모팅

✔️ 새 형식을 디자인할 때 직렬화에 대해 생각해 보세요.

지원할 올바른 직렬화 기술 선택

✔️ 형식의 인스턴스를 웹 서비스에서 유지하거나 사용해야 하는 경우 데이터 계약 직렬화를 지원하는 것이 좋습니다.

✔️ 형식이 serialize될 때 생성되는 XML 형식에 대한 더 많은 제어가 필요한 경우 데이터 계약 직렬화 대신 또는 데이터 계약 직렬화 외에 XML Serialization을 지원하는 것이 좋습니다.

예를 들어 데이터 계약 직렬화에서 지원되지 않는 XML 구문을 사용하여 XML 특성을 생성해야 하는 일부 상호 운용성 시나리오에서 필요할 수 있습니다.

✔️ 형식의 인스턴스가 .NET 원격 경계를 넘어 이동해야 하는 경우 런타임 Serialization을 지원하는 것이 좋습니다.

❌ 일반적인 지속성 이유로 런타임 Serialization 또는 XML Serialization을 지원하지 않습니다. 대신 데이터 계약 직렬화를 선호합니다.

데이터 계약 직렬화 지원

형식은 DataContractAttribute을 형식에 적용하고 DataMemberAttribute을 형식의 구성원(필드 및 속성)에 적용하여 데이터 계약 직렬화를 지원할 수 있습니다.

✔️ 형식을 부분 신뢰에서 사용할 수 있는 경우 형식의 데이터 멤버를 공용으로 표시하는 것이 좋습니다.

완전 신뢰에서 데이터 계약 직렬 변환기는 비공개 형식 및 멤버를 직렬화 및 역직렬화할 수 있지만 부분 신뢰에서 퍼블릭 멤버만 직렬화 및 역직렬화할 수 있습니다.

✔️ 가 있는 모든 속성 DataMemberAttribute에 getter 및 setter를 구현합니다. 데이터 계약 직렬 변환기를 사용하려면 형식을 직렬화할 수 있는 것으로 간주하려면 getter와 setter가 모두 필요합니다. (.NET Framework 3.5 SP1에서 일부 컬렉션 속성은 읽기 전용으로 설정될 수 있습니다.) 형식이 부분 신뢰 환경에서 사용되지 않는 경우, 속성의 접근자 중 하나 또는 두 개 모두를 비공개로 설정할 수 있습니다.

✔️ 역직렬화된 인스턴스를 초기화하기 위해 serialization 콜백을 사용하는 것이 좋습니다.

개체가 역직렬화될 때 생성자가 호출되지 않습니다. (규칙에는 예외가 있습니다. 표시된 CollectionDataContractAttribute 컬렉션의 생성자는 역직렬화 중에 호출됩니다.) 따라서 일반 생성 중에 실행되는 모든 논리는 serialization 콜백 중 하나로 구현되어야 합니다.

OnDeserializedAttribute 는 가장 일반적으로 사용되는 콜백 특성입니다. 패밀리의 다른 특성은 OnDeserializingAttribute, OnSerializingAttributeOnSerializedAttribute. 역직렬화 전, 직렬화 전, 마지막으로 직렬화 후 각각 실행되는 콜백을 표시하는 데 사용할 수 있습니다.

✔️ 복합 개체 그래프를 역직렬화할 때 사용할 구체적인 형식을 나타내는 데 KnownTypeAttribute을(를) 사용하는 것을 고려하세요.

✔️ 직렬화 가능 형식을 만들거나 변경할 때 이전 버전과 앞으로 호환성을 고려하세요.

이후 버전의 직렬화된 스트림은 형식의 현재 버전으로 역직렬화될 수 있으며 그 반대의 경우도 마찬가지입니다.

데이터 계약 특성에 명시적 매개 변수를 사용하여 계약을 유지하기 위해 특별한 주의를 기울이지 않는 한, 개인 및 내부 데이터 멤버도 이후 버전의 형식에서 해당 이름, 형식 또는 순서를 변경할 수 없음을 이해해야 합니다.

직렬화 가능 형식을 변경할 때 serialization의 호환성을 테스트합니다. 새 버전을 이전 버전으로 역직렬화하고 그 반대의 경우도 마찬가지입니다.

✔️ 서로 다른 버전의 타입 간에 라운드트립을 허용할 수 있도록 IExtensibleDataObject 구현하는 것을 고려하십시오.

이 인터페이스를 사용하면 직렬 변환기가 라운드트립 중에 데이터가 손실되지 않도록 할 수 있습니다. 이 IExtensibleDataObject.ExtensionData 속성은 현재 버전에 알 수 없는 형식의 이후 버전에서 데이터를 저장하는 데 사용되므로 해당 데이터 멤버에 저장할 수 없습니다. 이후 현재 버전이 직렬화되고 이후 버전으로 역직렬화되면 직렬화된 스트림에서 추가 데이터를 사용할 수 있습니다.

XML Serialization 지원

데이터 계약 직렬화는 .NET Framework의 기본(기본) 직렬화 기술이지만 데이터 계약 직렬화가 지원하지 않는 serialization 시나리오가 있습니다. 예를 들어 직렬 변환기에서 생성하거나 사용하는 XML의 모양을 완전히 제어할 수는 없습니다. 이러한 세밀한 제어가 필요한 경우 XML Serialization을 사용해야 하며 이 serialization 기술을 지원하도록 형식을 디자인해야 합니다.

❌ 생성된 XML의 모양을 제어할 강력한 이유가 없다면 XML Serialization에 맞게 형식을 디자인하지 마십시오. 이 serialization 기술은 이전 섹션에서 설명한 데이터 계약 직렬화로 대체되었습니다.

✔️ XML Serialization 특성을 적용하여 IXmlSerializable 제공하는 것보다 직렬화된 XML의 모양을 더 자세히 제어하려면 인터페이스를 구현하는 것이 좋습니다. 인터페이스 ReadXml 의 두 가지 메서드와 WriteXml직렬화된 XML 스트림을 완전히 제어할 수 있습니다. 를 적용하여 형식에 대해 생성되는 XML 스키마를 제어할 수도 있습니다 XmlSchemaProviderAttribute.

런타임 직렬화 지원

런타임 직렬화는 .NET Remoting에서 사용하는 기술입니다. .NET 원격을 사용하여 형식을 전송할 예정이라면, 해당 형식이 런타임 직렬화를 지원하는지 확인해야 합니다.

런타임 Serialization에 대한 기본 지원은 SerializableAttribute을 적용하여 제공할 수 있으며, 더 고급 시나리오에서는 간단한 런타임 Serializable 패턴을 구현하고 serialization 생성자를 추가하여 구현 ISerializable 합니다.

✔️ 귀하의 유형이 .NET 리모팅에서 사용될 경우, 런타임 직렬화를 지원하는 것이 권장됩니다. 예를 들어 System.AddIn 네임스페이스는 .NET 리모팅을 사용하므로 System.AddIn 추가 기능 간에 교환되는 모든 형식은 런타임 직렬화를 지원해야 합니다.

✔️ serialization 프로세스를 완전히 제어하려면 런타임 직렬화 가능 패턴을 구현하는 것이 좋습니다. 예를 들어 직렬화되거나 역직렬화될 때 데이터를 변환하려는 경우입니다.

패턴은 매우 간단합니다. 인터페이스를 구현 ISerializable 하고 개체가 역직렬화될 때 사용되는 특수 생성자를 제공하기만 하면 됩니다.

✔️ serialization 생성자를 보호하고 여기에 있는 샘플과 같이 정확하게 형식화되고 명명된 두 개의 매개 변수를 제공합니다.

[Serializable]
public class Person : ISerializable
{
    protected Person(SerializationInfo info, StreamingContext context)
    {
        // ...
    }
}

✔️ ISerializable 멤버를 명시적으로 구현하십시오.

✔️ 구현에 링크 요구를 적용해야 합니다 ISerializable.GetObjectData. 이렇게 하면 멤버에 완전히 신뢰할 수 있는 코어와 런타임 직렬화 도구만 액세스할 수 있습니다.

Microsoft Corporation의 일부 저작권 2005, 2009. 모든 권리 보유.

프레임워크 디자인 지침에서 Pearson Education, Inc.의 권한으로 재인쇄 : 재사용 가능한 .NET 라이브러리에 대한 규칙, 관용구 및 패턴, Krzysztof Cwalina 및 Brad Abrams의 제2판, Microsoft Windows 개발 시리즈의 일환으로 Addison-Wesley Professional이 2008년 10월 22일 출판했습니다.

참고하십시오