다음을 통해 공유


데이터 멤버 기본값

.NET Framework에서 형식에는 기본값의 개념이 있습니다. 예를 들어 참조 형식의 경우 기본값은 null0이고 정수 형식의 경우 0입니다. 기본값으로 설정된 경우 직렬화된 데이터에서 데이터 멤버를 생략하는 것이 좋습니다. 멤버에 기본값이 있으므로 실제 값을 serialize할 필요가 없습니다. 성능 이점이 있습니다.

serialize된 데이터에서 멤버를 생략하려면 EmitDefaultValue 특성의 DataMemberAttribute 속성을 false로 설정합니다(기본값은 true입니다).

비고

EmitDefaultValue 속성을 false로 설정해야 하는 경우는 상호 운용성 또는 데이터 크기 감소와 같은 특정 요구 사항이 있을 때입니다.

예시

다음 코드에는 여러 멤버가 EmitDefaultValue에 설정되어 false 있습니다.

[DataContract]
public class Employee
{
    [DataMember]
    public string employeeName = null;
    [DataMember]
    public int employeeID = 0;
    [DataMember(EmitDefaultValue = false)]
    public string position = null;
    [DataMember(EmitDefaultValue = false)]
    public int salary = 0;
    [DataMember(EmitDefaultValue = false)]
    public int? bonus = null;
    [DataMember(EmitDefaultValue = false)]
    public int targetSalary = 57800;
}
<DataContract()> _
Public Class Employee
    <DataMember()> _
    Public employeeName As String = Nothing
    <DataMember()> _
    Public employeeID As Integer = 0
    <DataMember(EmitDefaultValue:=False)> _
    Public position As String = Nothing
    <DataMember(EmitDefaultValue:=False)> _
    Public salary As Integer = 0
    <DataMember(EmitDefaultValue:=False)> _
    Public Bonus As Integer = Bonus OrElse Nothing
    <DataMember(EmitDefaultValue:=False)> _
    Public targetSalary As Integer = 57800
End Class

이 클래스의 인스턴스가 직렬화되면 다음과 같은 결과가 나타납니다: employeeNameemployeeID이 직렬화됩니다. null 값 employeeName 과 0 값 employeeID 은 명시적으로 serialize된 데이터의 일부입니다. 그러나 position, salarybonus 멤버는 serialize되지 않습니다. 마지막으로, targetSalaryEmitDefaultValue 속성이 false로 설정되어 있음에도 불구하고, 57800이 .NET의 정수 기본값인 0과 일치하지 않기 때문에 평소와 같이 직렬화됩니다.

XML 표현

이전 예제가 XML로 serialize된 경우 표현은 다음과 유사합니다.

<Employee>  
   <employeeName xsi:nil="true" />  
   <employeeID>0</employeeID>  
<targetSalary>57800</targetSalary>  
</Employee>  

xsi:nil 특성은 Null 값을 명시적으로 나타내는 상호 운용 가능한 방법을 제공하는 W3C(World Wide Web Consortium) XML 스키마 인스턴스 네임스페이스의 특수 특성입니다. XML에는 위치, 급여 및 보너스 데이터 멤버에 대한 정보가 전혀 없습니다. 수신 측은 이를 null, 0, 및 null로 각각 해석할 수 있습니다. 타사 역직렬 변환기가 올바른 해석을 수행할 수 있다는 보장은 없으므로 이 패턴을 사용하지 않는 것이 좋습니다. 클래스는 DataContractSerializer 항상 누락된 값에 대한 올바른 해석을 선택합니다.

IsRequired와의 상호 작용

데이터 계약 버전 관리DataMemberAttribute에서 설명한 대로 특성에는 IsRequired 속성이 있습니다(기본값은 false). 속성은 역직렬화될 때 지정된 데이터 멤버가 직렬화된 데이터에 있어야 하는지 여부를 나타냅니다. IsRequiredtrue로 설정되고 (이는 값이 있어야 한다는 것을 나타냅니다) EmitDefaultValuefalse로 설정된 경우 (이는 값이 기본값으로 설정될 경우 값이 없어야 함을 나타냅니다), 결과가 모순되기 때문에 이 데이터 멤버의 기본값을 직렬화할 수 없습니다. 이러한 데이터 멤버가 기본값(일반적으로 null 또는 0)으로 설정되고 serialization을 시도하면 throw SerializationException 됩니다.

스키마 표현

속성이 설정된 EmitDefaultValue 경우 false 데이터 멤버의 XSD(XML 스키마 정의 언어) 스키마 표현에 대한 세부 정보는 데이터 계약 스키마 참조에서 설명합니다. 그러나 간단한 개요는 다음과 같습니다.

  • EmitDefaultValuefalse로 설정되었을 때, 이는 Windows Communication Foundation (WCF)와 관련된 주석으로 스키마에 표시됩니다. 이 정보를 나타내는 상호 운용 가능한 방법은 없습니다. 특히 스키마의 "기본" 특성은 이 용도로 사용되지 않으며, minOccurs 특성은 설정에 IsRequired 의해서만 영향을 받으며 nillable , 특성은 데이터 멤버의 형식에 의해서만 영향을 받습니다.

  • 사용할 실제 기본값은 스키마에 없습니다. 누락된 요소를 적절하게 해석하는 것은 수신 엔드포인트에 달려 있습니다.

스키마 가져오기가 수행될 때, 앞에서 언급한 WCF 관련 주석이 감지되면 EmitDefaultValue 속성이 자동으로 false으로 설정됩니다. 또한 ASP.NET 웹 서비스를 사용할 때 흔히 발생하는 특정 상호 운용성 시나리오를 지원하기 위해 false 속성이 설정된 참조 형식의 nillable 도 설정됩니다.

참고하십시오