|
이 문서는 수동으로 번역한 것입니다. 원본 텍스트를 보려면 포인터를 문서의 문장 위로 올리십시오.
|
번역
원본
|
Serialization 및 Deserialization
주의
|
|---|
|
|
루트 형식 지정
알려진 형식 지정
<DataContract()> _ Public Class LibraryPatron <DataMember()> _ Public borrowedItems() As LibraryItem End Class <DataContract()> _ Public Class LibraryItem 'code not shown End Class 'LibraryItem <DataContract()> _ Public Class Book Inherits LibraryItem 'code not shown End Class <DataContract()> _ Public Class Newspaper Inherits LibraryItem 'code not shown End Class
기본 루트 이름 및 네임스페이스 지정
[DataContract(Name = "PersonContract", Namespace = "http://schemas.contoso.com")] public class Person2 { [DataMember(Name = "AddressMember")] public Address theAddress; } [DataContract(Name = "AddressContract", Namespace = "http://schemas.contoso.com")] public class Address { [DataMember(Name = "StreetMember")] public string street; }
<PersonContract xmlns="http://schemas.contoso.com">
<AddressMember>
<StreetMember>123 Main Street</StreetMember>
</AddressMember>
</PersonContract>
최대 개체 할당량 설정
라운드트립
라운드트립과 관련된 보안 및 스키마 유효성 검사 문제
라운드트립 사용 및 사용 안 함
개체 그래프 유지
<PurchaseOrder> <billTo><street>123 Main St.</street></billTo> <shipTo><street>123 Main St.</street></shipTo> </PurchaseOrder>
성능. 데이터 복제가 비효율적입니다. 순환 참조. 개체가 다른 개체를 통해 자신을 참조하는 경우에도, 복제로 serialize하면 무한 루프가 발생합니다. 이 경우 serializer가 SerializationException을 throw합니다. 의미. 경우에 따라 두 개의 참조가 똑같은 두 개의 개체로 이루어지는 것이 아니라, 하나의 동일한 개체로 이루어지도록 하는 것이 중요합니다.
<PurchaseOrder ser:id="1"> <billTo ser:id="2"><street ser:id="3">123 Main St.</street></billTo> <shipTo ser:ref="2"/> </PurchaseOrder>
중요 |
|---|
preserveObjectReferences가 true로 설정된 상태에서, DataContractSerializer에서 생성한 XML은 다른 기술과 상호 운용할 수 없고, 또한 preserveObjectReferences가 true로 설정된 상태에서는 다른 DataContractSerializer 인스턴스에서만 이 XML에 액세스할 수 있습니다. 이 기능에 대해서는 메타데이터(스키마)가 지원되지 않습니다. 생성된 스키마는 preserveObjectReferences가 false로 설정된 경우에만 유효합니다. 이 기능으로 인해 serialization 및 deserialization 프로세스 실행 속도가 느려질 수 있습니다. 데이터를 복제하지 않아도 되지만 이 모드에서 추가 개체 비교를 수행해야 합니다.
주의 |
|---|
데이터 계약 서로게이트 지정
간단한 Serialization
<Person> <Name>Jay Hamlin</Name> <Address>123 Main St.</Address> </Person>
단계별 Serialization
참고
|
|---|
|
|
<Person serializedBy="myCode"> <Name>Jay Hamlin</Name> <Address>123 Main St.</Address> </Person>
<MyCustomWrapper> <Name>Jay Hamlin</Name> <Address>123 Main St.</Address> </MyCustomWrapper>
참고 |
|---|
DataContractSerializer ser = new DataContractSerializer(typeof(Person), "Customer", @"http://www.contoso.com"); FileStream fs = new FileStream(path, FileMode.Open); XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas()); while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: if (ser.IsStartObject(reader)) { Console.WriteLine("Found the element"); Person p = (Person)ser.ReadObject(reader); Console.WriteLine("{0} {1} id:{2}", p.Name , p.Address); } Console.WriteLine(reader.Name); break; } }
-
보안. XML에 deserialize되고 있는 모든 형식이 로드됩니다. 이를 악용해 악의적인 형식이 로드될 수 있습니다. Binder 속성 또는 생성자 매개 변수로 Serialization 바인더를 사용하는 경우에만, 신뢰할 수 없는 데이터에 NetDataContractSerializer를 사용해야 합니다. 바인더는 안전한 형식만 로드할 수 있도록 허용합니다. 바인더 메커니즘은 System.Runtime.Serialization 네임스페이스의 형식에서 사용하는 메커니즘과 동일합니다. -
버전 관리. XML에 전체 형식 및 어셈블리 이름을 사용하면 형식 버전을 관리할 수 있는 방식이 제한됩니다. 형식 이름, 네임스페이스, 어셈블리 이름 및 어셈블리 버전은 변경할 수 없습니다. AssemblyFormat 속성이나 생성자 매개 변수를 Full의 기본값 대신 Simple로 설정하면, 어셈블리 버전을 변경할 수 있지만 일반 매개 변수의 형식 버전은 변경할 수 없습니다. -
상호 운용성. .NET Framework 형식 및 어셈블리 이름은 XML에 포함되어 있기 때문에 .NET Framework 이외의 다른 플랫폼에서는 결과 데이터에 액세스할 수 없습니다. -
성능. 형식 및 어셈블리 이름을 작성하면 생성되는 XML의 크기가 크게 늘어납니다.
-
생성자를 사용하기 위해 루트 형식을 지정하지 않아도 됩니다. NetDataContractSerializer 의 같은 인스턴스를 사용하여 형식을 serialize할 수 있습니다. -
생성자는 알려진 형식의 목록을 허용하지 않습니다. 형식 이름이 XML로 serialize되는 경우 알려진 형식 메커니즘은 필요하지 않습니다. -
생성자는 데이터 계약 서로게이트를 허용하지 않습니다. 대신 SurrogateSelector 속성에 매핑되는 surrogateSelector라고 하는 ISurrogateSelector 매개 변수를 허용합니다. 이것이 바로 레거시 서로게이트 메커니즘입니다. -
생성자는 AssemblyFormat 속성에 매핑되는 FormatterAssemblyStyle의 assemblyFormat이라는 매개 변수를 허용합니다. 이전에 설명한 대로 이 메커니즘은 serializer의 버전 관리 기능을 향상시키는 데 사용할 수 있으며, 이진 또는 SOAP serialization의 FormatterAssemblyStyle 메커니즘과 동일합니다. -
생성자는 Context 속성에 매핑되는 context라는 StreamingContext 매개 변수를 허용합니다. 이 메커니즘은 정보를 serialize되고 있는 형식으로 전달할 수 있으며, 이 사용 방법은 다른 System.Runtime.Serialization 클래스에 사용된 StreamingContext 메커니즘의 사용 방법과 동일합니다. -
Serialize 및 Deserialize 메서드는 WriteObject 및 ReadObject 메서드의 별칭입니다. 이러한 메서드는 이진 또는 SOAP serialization에 보다 일관된 프로그래밍 모델을 제공하기 위해 존재합니다.
주의